static bool WellKnownException( const Exception * E, UnicodeString * AMessage, const wchar_t ** ACounterName, Exception ** AClone, bool Rethrow) { UnicodeString Message; const wchar_t * CounterName = nullptr; std::unique_ptr<Exception> Clone; bool Result = true; bool IgnoreException = false; // if (!IgnoredExceptions.empty()) // { // TGuard Guard(*IgnoredExceptionsCriticalSection.get()); // UnicodeString ClassName = ""; // NormalizeClassName(E->QualifiedClassName()); // IgnoreException = (IgnoredExceptions.find(ClassName) != IgnoredExceptions.end()); // } if (IgnoreException) { Result = false; } // EAccessViolation is EExternal else if (isa<EAccessViolation>(E)) { if (Rethrow) { throw EAccessViolation(E->Message); } Message = MainInstructions(LoadStr(ACCESS_VIOLATION_ERROR3)); CounterName = L"AccessViolations"; Clone.reset(new EAccessViolation(E->Message)); } /* // EIntError and EMathError are EExternal // EClassNotFound is EFilerError else if ((dyn_cast<EListError>(E) != nullptr) || (dyn_cast<EStringListError>(E) != nullptr) || (dyn_cast<EIntError>(E) != nullptr) || (dyn_cast<EMathError>(E) != nullptr) || (dyn_cast<EVariantError>(E) != nullptr) || (dyn_cast<EInvalidOperation>(E) != nullptr)) (dynamic_cast<EFilerError*>(E) != NULL)) { if (Rethrow) { throw EIntError(E->Message); } Message = MainInstructions(E->Message); CounterName = L"InternalExceptions"; Clone.reset(new EIntError(E->Message)); } else if (dyn_cast<EExternal>(E) != nullptr) { if (Rethrow) { throw EExternal(E->Message); } Message = MainInstructions(E->Message); CounterName = L"ExternalExceptions"; Clone.reset(new EExternal(E->Message)); } else if (dyn_cast<EHeapException>(E) != nullptr) { if (Rethrow) { throw EHeapException(E->Message); } Message = MainInstructions(E->Message); CounterName = L"HeapExceptions"; Clone.reset(new EHeapException(E->Message)); } */ else { Result = false; } if (Result) { if (AMessage != nullptr) { (*AMessage) = Message; } if (ACounterName != nullptr) { (*ACounterName) = CounterName; } if (AClone != nullptr) { (*AClone) = DebugNotNull(Clone.release()); } } return Result; }
static bool WellKnownException( const Exception * E, UnicodeString * AMessage, const wchar_t ** ACounterName, Exception ** AClone, bool Rethrow) { UnicodeString Message; const wchar_t * CounterName = nullptr; std::unique_ptr<Exception> Clone; bool Result = true; // EAccessViolation is EExternal if (NB_STATIC_DOWNCAST_CONST(EAccessViolation, E) != nullptr) { if (Rethrow) { throw EAccessViolation(E->Message); } Message = MainInstructions(LoadStr(ACCESS_VIOLATION_ERROR3)); CounterName = L"AccessViolations"; Clone.reset(new EAccessViolation(E->Message)); } /* // EIntError and EMathError are EExternal else if ((NB_STATIC_DOWNCAST(EListError, E) != nullptr) || (NB_STATIC_DOWNCAST(EStringListError, E) != nullptr) || (NB_STATIC_DOWNCAST(EIntError, E) != nullptr) || (NB_STATIC_DOWNCAST(EMathError, E) != nullptr) || (NB_STATIC_DOWNCAST(EVariantError, E) != nullptr) || (NB_STATIC_DOWNCAST(EInvalidOperation, E) != nullptr)) { if (Rethrow) { throw EIntError(E->Message); } Message = E->Message; CounterName = L"InternalExceptions"; Clone.reset(new EIntError(E->Message)); } else if (NB_STATIC_DOWNCAST(EExternal, E) != nullptr) { if (Rethrow) { throw EExternal(E->Message); } Message = MainInstructions(E->Message); CounterName = L"ExternalExceptions"; Clone.reset(new EExternal(E->Message)); } else if (NB_STATIC_DOWNCAST(EHeapException, E) != nullptr) { if (Rethrow) { throw EHeapException(E->Message); } Message = MainInstructions(E->Message); CounterName = L"HeapExceptions"; Clone.reset(new EHeapException(E->Message)); } */ else { Result = false; } if (Result) { if (AMessage != nullptr) { (*AMessage) = Message; } if (ACounterName != nullptr) { (*ACounterName) = CounterName; } if (AClone != nullptr) { (*AClone) = NOT_NULL(Clone.release()); } } return Result; }