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

C# 如何正确实现异常处理程序方法?,c#,vb.net,C#,Vb.net,假设我有以下构造: Public Sub SomeMethod() Try doSomething() Catch ex as Exception handleException(ex) End Try End Sub 我想写handleException(ex)。假设我的类有不同的事件处理选项: Public Enum ExceptionHandlingType DisplayInMessageBox 'Display in msg

假设我有以下构造:

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”时,如何生成一个干净的堆栈跟踪(其他每个选项似乎都可以正常工作)


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

请看一下,了解异常处理的最佳实践

编辑: 看看答案,找到保存堆栈跟踪的方法

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

< P>尝试将调用更改为

if (!HandleException(ex)) throw;
HandleException()

bool HandleException(Exception ex) {
    bool handled = false;

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

这应该可以解决问题。

看看这个,你不应该创建任何这样的方法。你应该只“处理”你能真正处理的异常。我想也许我需要走Log4Net之类的路线。他们能够有一个“handleException-like”方法来记录文件或弹出消息框。。。但是,如果使用不同的方法,如何正确地抛出它呢?这正是我最初在这个1类中的大约200个位置(实际上是一个GUI控件),所以我想也许我应该将它重构为1个位置,如“HandleException”方法,这就是我想弄明白的方法。我知道的唯一简单的方法是在不使用抛出的情况下保留异常的堆栈跟踪;catch块中的语法是将其包装在一个新的异常中。看看这里:进行一些讨论。我可以预测下一条评论,所以我要说这是已经存在多年的旧代码,每个人都对它进行了修改。我只是试图控制错误处理,而不是将其放在200个位置,如果有新选项,则必须在200个位置对其进行修改。我尝试将其包装在另一个异常中。见上文我的案例陈述。但问题是,这种异常包装会产生最奇怪的堆栈跟踪,这没有任何意义——它不是顺序的,因为一旦我输入“handleException”,序列就会变得混乱我完全同意你上面的观点,但是代码就是这样,当然,重新编写它将是理想的,包括所有的异常处理,这些异常处理主要是从旧的访问代码转换而来的,并使用Log4Net,但不是一个选项。
if (!HandleException(ex)) throw;
bool HandleException(Exception ex) {
    bool handled = false;

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