Example #1
0
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;
}
Example #2
0
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;
}