Diff for /parser3/src/include/pa_exception.h between versions 1.3 and 1.78

version 1.3, 2001/01/30 13:43:42 version 1.78, 2026/10/18 22:42:42
Line 1 Line 1
 /*  /** @file
   $Id$          Parser: exception decls.
   
           Copyright (c) 2001-2026 Art. Lebedev Studio (https://www.artlebedev.com)
           Authors: Konstantin Morshnev <moko@design.ru>, Alexandr Petrosian <paf@design.ru>
 */  */
   
 #ifndef PA_EXCEPTION_H  #ifndef PA_EXCEPTION_H
 #define PA_EXCEPTION_H  #define PA_EXCEPTION_H
   
 #include <setjmp.h>  #define IDENT_PA_EXCEPTION_H "$Id$"
   
   const char* const PARSER_RUNTIME = "parser.runtime";
   const char* const IMAGE_FORMAT = "image.format";
   const char* const PCRE_EXCEPTION_TYPE = "pcre.execute";
   const char* const DATE_RANGE_EXCEPTION_TYPE = "date.range";
   const char* const BASE64_FORMAT = "base64.format";
   
   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 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_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";
   
   // includes
   
 #include "pa_types.h"  #include "pa_memory.h"
 #include "pa_string.h"  
   // forwards
   
   class String;
   
   // defines
   
 class Exception {  class Exception {
 public:  public:
   
         // address for long jump to jump to           Exception();
         // regretfully public:          Exception(const char* atype, const String* aproblem_source, const char* comment_fmt, ...);
         //   can't make local unless sure of inlining          Exception(const Exception& src);
         //   for to-die stack frame ruins it all  
         jmp_buf mark;          operator bool() { return ftype || fproblem_source || fcomment; }
           Exception& operator =(const Exception& src);
         void raise(  
                 const String *atype, const String *acode,          /// extracts exception type
                 const String *aproblem_source,           const char* type(bool can_be_empty=false) const {
                 const char *comment_fmt, ...);                  return can_be_empty || ftype ? ftype : "<no type>";
           }
         const String *type() { return ftype; }  
         const String *code() { return fcode; }          /// extracts exception problem_source
         const String *problem_source() { return fproblem_source; }          const String* problem_source() const;
         const char *comment() { return fcomment[0]?fcomment:0; }  
           /// extracts exception comment
           const char* comment(bool can_be_empty=false) const {
                   const char* result=fcomment && *fcomment ? fcomment : 0;
                   return can_be_empty || result ? result : "<no comment>";
           }
   
           // modifies exception to fine-tune error reporting
           void set_source(const String* aproblem_source) {
                   if(!problem_source())
                           fproblem_source=pa_gc_reference(aproblem_source);
           }
   
           void add_comment(const char* acomment);
   
   #define ALTER_EXCEPTION_SOURCE(code, source)    \
           try {                                   \
                   code;                           \
           } catch (Exception& e) {                \
                   e.set_source(source);           \
                   rethrow;                        \
           }
   
   #define ALTER_EXCEPTION_COMMENT(code, comment)  \
           try {                                   \
                   code;                           \
           } catch (Exception& e) {                \
                   e.add_comment(comment);         \
                   rethrow;                        \
           }
   
   protected:
   
           const char* ftype;
           const String* fproblem_source;
           const char* fcomment;
   
 private:  
   
         const String *ftype, *fcode, *fproblem_source;  
         char fcomment[MAX_STRING];  
 };  };
   
 // usage:  // recovery recursion reserve is exhausted: bypass catch/finally handlers
 //   if(EXCEPTION_TRY(e)) { ...; if(?) e.raise(?); ...; } else { catch-code }  class Recursion_limit_exception: public Exception {
 #define EXCEPTION_TRY(e) (setjmp((e).mark)==0)  public:
           Recursion_limit_exception(): Exception(PARSER_RUNTIME, 0, "call canceled - endless recursion recovery limit exceeded") {}
   };
   
 #endif  #endif

Removed from v.1.3  
changed lines
  Added in v.1.78


E-mail: