ExtException::ExtException(const Exception * E, const UnicodeString & Msg, const UnicodeString & HelpKeyword) : Exception(OBJECT_CLASS_ExtException, Msg), FMoreMessages(nullptr) { AddMoreMessages(E); FHelpKeyword = MergeHelpKeyword(HelpKeyword, GetExceptionHelpKeyword(E)); }
ExtException::ExtException(TObjectClassId Kind, const Exception * E, const UnicodeString & Msg, const UnicodeString & HelpKeyword) : Exception(Kind, Msg), FMoreMessages(nullptr) { AddMoreMessages(E); FHelpKeyword = MergeHelpKeyword(HelpKeyword, GetExceptionHelpKeyword(E)); }
//--------------------------------------------------------------------------- unsigned int __fastcall ExceptionMessageDialog(Exception * E, TQueryType Type, const UnicodeString MessageFormat, unsigned int Answers, UnicodeString HelpKeyword, const TMessageParams * Params) { TStrings * MoreMessages = NULL; ExtException * EE = dynamic_cast<ExtException *>(E); if (EE != NULL) { MoreMessages = EE->MoreMessages; } UnicodeString Message; // this is always called from within ExceptionMessage check, // so it should never fail here CHECK(ExceptionMessageFormatted(E, Message)); HelpKeyword = MergeHelpKeyword(HelpKeyword, GetExceptionHelpKeyword(E)); std::unique_ptr<TStrings> OwnedMoreMessages; if (AppendExceptionStackTraceAndForget(MoreMessages)) { OwnedMoreMessages.reset(MoreMessages); } return MoreMessageDialog( FORMAT(MessageFormat.IsEmpty() ? UnicodeString(L"%s") : MessageFormat, (Message)), MoreMessages, Type, Answers, HelpKeyword, Params); }
ExtException::ExtException(TObjectClassId Kind, const UnicodeString & Msg, const Exception * E, const UnicodeString & HelpKeyword) : Exception(Kind, L""), FMoreMessages(nullptr) { // "copy exception" AddMoreMessages(E); // and append message to the end to more messages if (!Msg.IsEmpty()) { if (Message.IsEmpty()) { Message = Msg; } else { if (FMoreMessages == nullptr) { FMoreMessages = new TStringList(); } FMoreMessages->Append(UnformatMessage(Msg)); } } FHelpKeyword = MergeHelpKeyword(GetExceptionHelpKeyword(E), HelpKeyword); }