--- parser3/src/include/pa_exception.h 2024/12/06 22:03:58 1.71 +++ parser3/src/include/pa_exception.h 2026/10/18 22:42:42 1.78 @@ -1,14 +1,14 @@ /** @file Parser: exception decls. - Copyright (c) 2001-2024 Art. Lebedev Studio (http://www.artlebedev.com) + Copyright (c) 2001-2026 Art. Lebedev Studio (https://www.artlebedev.com) Authors: Konstantin Morshnev , Alexandr Petrosian */ #ifndef PA_EXCEPTION_H #define PA_EXCEPTION_H -#define IDENT_PA_EXCEPTION_H "$Id: pa_exception.h,v 1.71 2024/12/06 22:03:58 moko Exp $" +#define IDENT_PA_EXCEPTION_H "$Id: pa_exception.h,v 1.78 2026/10/18 22:42:42 moko Exp $" const char* const PARSER_RUNTIME = "parser.runtime"; const char* const IMAGE_FORMAT = "image.format"; @@ -18,15 +18,16 @@ const char* const BASE64_FORMAT = "base6 const char* const NAME_MUST_BE_STRING = "name must be string"; const char* const FILE_NAME_MUST_BE_STRING = "file name must be string"; +const char* const FILE_NAME_MUST_BE_STRING_OR_FILE = "file name must be string or file"; +const char* const FILE_NAME_MUST_BE_NE_STRING = "file name must be not empty string"; const char* const VALUE_MUST_BE_STRING = "value must be string"; const char* const PARAMETER_MUST_BE_STRING = "parameter must be string"; const char* const COLUMN_NAME_MUST_BE_STRING = "column name must be string"; const char* const FILE_NAME_MUST_BE_SPECIFIED = "file name must be specified"; -const char* const FIRST_ARG_MUST_NOT_BE_CODE = "first argument must not be code"; const char* const PARAM_MUST_NOT_BE_CODE = "param must not be code"; const char* const PARAM_MUST_BE_HASH = "param must be hash"; -const char* const MODE_MUST_NOT_BE_CODE = "mode must not be code"; +const char* const MODE_MUST_BE_STRING = "mode must be string"; const char* const OPTIONS_MUST_NOT_BE_CODE = "options must not be code"; const char* const CALLED_WITH_INVALID_OPTION = "called with invalid option"; @@ -68,7 +69,7 @@ public: // modifies exception to fine-tune error reporting void set_source(const String* aproblem_source) { if(!problem_source()) - fproblem_source=aproblem_source; + fproblem_source=pa_gc_reference(aproblem_source); } void add_comment(const char* acomment); @@ -97,4 +98,10 @@ protected: }; +// recovery recursion reserve is exhausted: bypass catch/finally handlers +class Recursion_limit_exception: public Exception { +public: + Recursion_limit_exception(): Exception(PARSER_RUNTIME, 0, "call canceled - endless recursion recovery limit exceeded") {} +}; + #endif