如何正确地实现异常处理程序方法?
本文关键字:方法 异常处理程序 实现 正确地 | 更新日期: 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场景。此时,您可以通过使用反射提取堆栈跟踪来获得一个临时解决方案,但将来请考虑重构异常处理模型。