| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 | //---------------------------------------------------------------------------#ifndef ExceptionsH#define ExceptionsH#include <Classes.hpp>#include <SysUtils.hpp>#include <SysInit.hpp>#include <System.hpp>//---------------------------------------------------------------------------bool __fastcall ShouldDisplayException(Exception * E);bool __fastcall ExceptionMessage(Exception * E, UnicodeString & Message);bool __fastcall ExceptionMessageFormatted(Exception * E, UnicodeString & Message);bool __fastcall ExceptionFullMessage(Exception * E, UnicodeString & Message);UnicodeString __fastcall SysErrorMessageForError(int LastError);UnicodeString __fastcall LastSysErrorMessage();TStrings * __fastcall ExceptionToMoreMessages(Exception * E);bool __fastcall IsInternalException(Exception * E);//---------------------------------------------------------------------------enum TOnceDoneOperation { odoIdle, odoDisconnect, odoSuspend, odoShutDown };//---------------------------------------------------------------------------class ExtException : public Sysutils::Exception{public:  __fastcall ExtException(Exception* E);  __fastcall ExtException(Exception* E, UnicodeString Msg, UnicodeString HelpKeyword = L"");  // "copy the exception", just append message to the end  __fastcall ExtException(UnicodeString Msg, Exception* E, UnicodeString HelpKeyword = L"");  __fastcall ExtException(UnicodeString Msg, UnicodeString MoreMessages, UnicodeString HelpKeyword = L"");  __fastcall ExtException(UnicodeString Msg, TStrings* MoreMessages, bool Own, UnicodeString HelpKeyword = L"");  __fastcall virtual ~ExtException(void);  __property TStrings* MoreMessages = {read=FMoreMessages};  __property UnicodeString HelpKeyword = {read=FHelpKeyword};  inline __fastcall ExtException(const UnicodeString Msg, const TVarRec * Args, const int Args_Size) :    Sysutils::Exception(Msg, Args, Args_Size)  {  }  inline __fastcall ExtException(int Ident, const TVarRec * Args, const int Args_Size)/* overload */ :    Sysutils::Exception(Ident, Args, Args_Size)  {  }  inline __fastcall ExtException(const UnicodeString Msg, int AHelpContext) :    Sysutils::Exception(Msg, AHelpContext)  {  }  inline __fastcall ExtException(const UnicodeString Msg, const TVarRec * Args, const int Args_Size, int AHelpContext) :    Sysutils::Exception(Msg, Args, Args_Size, AHelpContext)  {  }  inline __fastcall ExtException(int Ident, int AHelpContext)/* overload */ :    Exception(Ident, AHelpContext)  {  }  inline __fastcall ExtException(PResStringRec ResStringRec, const TVarRec * Args, const int Args_Size, int AHelpContext)/* overload */ :    Sysutils::Exception(ResStringRec, Args, Args_Size, AHelpContext)  {  }  static ExtException * __fastcall CloneFrom(Exception * E);  virtual ExtException * __fastcall Clone();  virtual void __fastcall Rethrow();protected:  void __fastcall AddMoreMessages(Exception* E);private:  Classes::TStrings* FMoreMessages;  UnicodeString FHelpKeyword;};//---------------------------------------------------------------------------#define EXT_EXCEPTION_METHODS(NAME, BASE) \  public: \    inline __fastcall NAME(Exception* E, UnicodeString Msg, UnicodeString HelpKeyword = L"") : \      BASE(E, Msg, HelpKeyword) \    { \    } \    inline __fastcall NAME(Exception* E, int Ident) : \      BASE(E, Ident) \    { \    } \    inline __fastcall NAME(const UnicodeString & Msg, const UnicodeString & MoreMessages, const UnicodeString & HelpKeyword = UnicodeString()) : \      BASE(Msg, MoreMessages, HelpKeyword) \    { \    } \    inline __fastcall virtual ~NAME(void) \    { \    } \    inline __fastcall NAME(const UnicodeString Msg, const TVarRec * Args, const int Args_Size) : \      BASE(Msg, Args, Args_Size) \    { \    } \    inline __fastcall NAME(int Ident, const TVarRec * Args, const int Args_Size) : \      BASE(Ident, Args, Args_Size) \    { \    } \    inline __fastcall NAME(const UnicodeString Msg, int AHelpContext) : \      BASE(Msg, AHelpContext) \    { \    } \    inline __fastcall NAME(const UnicodeString Msg, const TVarRec * Args, const int Args_Size, int AHelpContext) : \      BASE(Msg, Args, Args_Size, AHelpContext) \    { \    } \    inline __fastcall NAME(int Ident, int AHelpContext) : \      BASE(Ident, AHelpContext) \    { \    } \    inline __fastcall NAME(PResStringRec ResStringRec, const TVarRec * Args, const int Args_Size, int AHelpContext) : \      BASE(ResStringRec, Args, Args_Size, AHelpContext) \    { \    } \    virtual ExtException * __fastcall Clone() \    { \      return new NAME(this, L""); \    } \    virtual void __fastcall Rethrow() \    { \      throw NAME(this, L""); \    }#define DERIVE_EXT_EXCEPTION(NAME, BASE) \  class NAME : public BASE \  { \    EXT_EXCEPTION_METHODS(NAME, BASE) \  };//---------------------------------------------------------------------------DERIVE_EXT_EXCEPTION(ESsh, ExtException);DERIVE_EXT_EXCEPTION(ETerminal, ExtException);DERIVE_EXT_EXCEPTION(ECommand, ExtException);DERIVE_EXT_EXCEPTION(EScp, ExtException); // SCP protocol fatal error (non-fatal in application context)class ESkipFile : public ExtException{public:  inline __fastcall ESkipFile() :    ExtException(NULL, UnicodeString())  {  }  EXT_EXCEPTION_METHODS(ESkipFile, ExtException)};//---------------------------------------------------------------------------class EOSExtException : public ExtException{public:  __fastcall EOSExtException();  __fastcall EOSExtException(UnicodeString Msg);  __fastcall EOSExtException(UnicodeString Msg, int LastError);};//---------------------------------------------------------------------------class ECRTExtException : public EOSExtException{public:  __fastcall ECRTExtException();  __fastcall ECRTExtException(UnicodeString Msg);};//---------------------------------------------------------------------------class EFatal : public ExtException{public:  // fatal errors are always copied, new message is only appended  __fastcall EFatal(Exception* E, UnicodeString Msg, UnicodeString HelpKeyword = L"");  __property bool ReopenQueried = { read = FReopenQueried, write = FReopenQueried };  virtual ExtException * __fastcall Clone();  virtual void __fastcall Rethrow();private:  bool FReopenQueried;};//---------------------------------------------------------------------------#define DERIVE_FATAL_EXCEPTION(NAME, BASE) \  class NAME : public BASE \  { \  public: \    inline __fastcall NAME(Exception* E, UnicodeString Msg, UnicodeString HelpKeyword = L"") : \      BASE(E, Msg, HelpKeyword) \    { \    } \    virtual ExtException * __fastcall Clone() \    { \      return new NAME(this, L""); \    } \  };//---------------------------------------------------------------------------DERIVE_FATAL_EXCEPTION(ESshFatal, EFatal);//---------------------------------------------------------------------------// exception that closes application, but displays info message (not error message)// = close on completionclass ESshTerminate : public EFatal{public:  inline __fastcall ESshTerminate(      Exception* E, UnicodeString Msg, TOnceDoneOperation AOperation,      const UnicodeString & ATargetLocalPath, const UnicodeString & ADestLocalFileName) :    EFatal(E, Msg),    Operation(AOperation),    TargetLocalPath(ATargetLocalPath),    DestLocalFileName(ADestLocalFileName)  {  }  virtual ExtException * __fastcall Clone();  virtual void __fastcall Rethrow();  TOnceDoneOperation Operation;  UnicodeString TargetLocalPath;  UnicodeString DestLocalFileName;};//---------------------------------------------------------------------------class ECallbackGuardAbort : public EAbort{public:  __fastcall ECallbackGuardAbort();};//---------------------------------------------------------------------------Exception * __fastcall CloneException(Exception * Exception);void __fastcall RethrowException(Exception * E);UnicodeString __fastcall GetExceptionHelpKeyword(Exception * E);UnicodeString __fastcall MergeHelpKeyword(const UnicodeString & PrimaryHelpKeyword, const UnicodeString & SecondaryHelpKeyword);bool __fastcall IsInternalErrorHelpKeyword(const UnicodeString & HelpKeyword);UnicodeString __fastcall AddContextToExceptionMessage(const Exception & E, const UnicodeString & NewContext);//---------------------------------------------------------------------------#endif  // Exceptions
 |