如何正确地实现异常处理程序方法?

本文关键字:方法 异常处理程序 实现 正确地 | 更新日期: 2023-09-27 18:01:29

假设我有以下结构:

Public Sub SomeMethod()
   Try
      doSomething()
   Catch ex as Exception
      handleException(ex)
   End Try
End Sub

我想写handleException(ex)。假设我的类有不同的事件处理选项:

 Public Enum ExceptionHandlingType
        DisplayInMessageBox 'Display in msgbox
        ThrowToCaller       'Raise the error to the caller routine
        RaiseOnMessageEvent 'e-mail
    End Enum

下面是我尝试写的"handleException"。似乎无论我做什么,如果对象被设置为"ThrowToCaller"的异常模式,那么当我使用handleException()时,堆栈跟踪就会变得一团糟。我怎么能有一个干净的堆栈跟踪生成时,选项是"ThrowToCaller"(每一个其他选项似乎是工作良好)

Public Sub handleException(ex as Exception)
  Select Case mExceptionHandling
            Case ExceptionHandlingType.DisplayInMessageBox
                MsgBox(ex.Message)
            Case ExceptionHandlingType.ThrowToCaller
                Throw New Exception(ex.Message, ex)
            Case ExceptionHandlingType.RaiseOnMessageEvent
                SendEMailMessage(ex)
        End Select
End Sub

如何正确地实现异常处理程序方法?

尝试将调用更改为

if (!HandleException(ex)) throw;

HandleException()

bool HandleException(Exception ex) {
    bool handled = false;
    if (ex is SomeException) {
        ... handle the exception ...
        handled = true
    }
    return handled;
}

要在catch块中保留异常的堆栈跟踪,必须使用以下语法抛出异常(在c#中,不熟悉VB):

try {
   // some operation ...
} 
catch (Exception ex) {
switch(mExceptionHandling) {
case ExceptionHandlingType.ThrowToCaller: throw;
case ExceptionHandlingType.DisplayInMessageBox: MsgBox(ex.Message); break;
case ExceptionHandlingType.RaiseOnMessageEvent: SendEmailMessage(ex); break;
default: throw;
}
}

查看异常处理块,了解异常处理的最佳实践。

编辑:

看看这里的答案,找到保留堆栈跟踪的方法。

编辑# 2 我认为这里的部分问题是,这不是处理手头用例异常的最佳方法。从它的外观来看,由于消息框,这看起来像GUI代码。应该在这个特定的catch块之外决定是否显示消息框。一种方法是使用AOP为某些操作和某些异常类型注入消息框处理程序。当您想要记录异常时,通常应用catch-rethrow场景。此时,您可以通过使用反射提取堆栈跟踪来获得一个临时解决方案,但将来请考虑重构异常处理模型。