【发布时间】:2013-06-24 12:48:06
【问题描述】:
编辑:
致所有回答者和评论者:请专注于提供我要求的解决方案,而不是提供重构它的方法。为简洁起见,下面提供的代码是一个非常精简的示例。我已经在下面说明了这种类型的代码存在于整个应用程序的 20 或 30 个位置,如果存在更简单的解决方案,我将选择不移动/合并/重构任何代码。
原问题:
首先,简要介绍一下:我们有一个由离岸团队开发的应用程序。此应用程序的目的是对各种数据库表进行夜间维护。它是一个 WinForms 应用程序,但它更像是一个控制台应用程序,因为它所做的只是 1) 在 Form1_Load 中执行单个方法,然后 2) 调用 End 以关闭程序。
问题是错误电子邮件通知不起作用,所以我负责修复它的任务。考虑这段代码:
Try
'This inner Try/Catch is actually code in another method
Try
'Run some code here
Catch ex As Exception
'Errors are logged silently to text file here
End Try
Catch ex As Exception
'Code to email exception details is here
End Try
问题是在内部的 Try/Catch 中抛出和处理异常。因此,在外部 Try/Catch 中不会处理任何异常,因此没有发送电子邮件通知。
有人可能会说只在内部 Catch 中添加 Throw ex,但请记住,代码中大约有 20 或 30 个位置是这样处理异常的。我正在做的决定是让它现在工作,而不是进行那种开发工作。因此,我寻求一种方法来获取应用程序抛出的最后一个异常。这样,我可以在外部 Try/Catch 中添加一个 finally 块并执行以下操作:
Finally
If Not Application.GetLastException() is Nothing Then
SendErrorEmail(Application.GetLastException())
End If
End Try
【问题讨论】:
-
捕获特定异常,绝不是 Exception 类型的一般异常。
-
为什么不检查是否有内容写入日志。
-
另外,.. 似乎你想在异常情况下做两件事。为什么不只进行一次 try/catch 并在一次 catch 中执行 2 个操作?所以:只需删除外部异常,然后将所有内容从该捕获移动到内部捕获。
-
@JorisVanRegemortel:如果您知道所有可以抛出的异常,那么可以。但是,对于未知的异常,我总是有一个基本的
Catch Ex。另外,这段代码不是我写的。 -
这正是我正在做的。您必须进行重构才能获得解决方案。您粘贴的代码无效。外部异常块永远不会触发。只要摆脱块并将其与内部块合并,你应该有你的解决方案。
标签: vb.net winforms .net-4.0 exception-handling