2009-06-02 54 views
2

我们所有人都使用try catch块。但是在自定义函数中处理错误的最佳方式是什么?在自定义函数内处理异常

当引发异常时(如果可能的话在函数中)显示一个消息框给用户,或者返回一个值表示在函数中发现了一个错误?

回答

2

它确实取决于函数,但总的来说,我会建议不要让它显示一个MessageBox给用户;这是用户界面的一项任务。如果函数(出于任何正当理由)确实显示一个MessageBox,则提供一个保证为“无声”的重载,以便该函数的调用者可以阻止该MessageBox。但是,正如我所说的,我认为最好让调用者决定如何处理异常。毕竟,这可能是从没有UI的Windows服务调用函数。

我通常使用这些方法之一:

  • 没有捕获异常可言,而是让它泡向上。这是通过在函数中不执行try-catch块来完成的。
  • 抓住异常,用它做一些事情(比如记录它),然后重新抛出它。
  • 捕获异常,将其包装(作为InnerException)作为抛出的新异常,可能已完成一些日志记录。

这适用于函数本身无法处理异常的情况。在某些情况下,函数可能会处理异常状态并继续执行其工作。在这些情况下,函数当然不会抛出异常。

+1

如果您想让它冒泡,请使用Andy建议的应用程序级异常处理程序。这样,您可以记录异常情况,如果需要显示消息框以及可能需要执行的任何其他操作。 – 2009-06-04 19:26:50

+0

@Sam:非常好的建议 – 2009-06-04 19:28:17

0

我让我所有的错误冒泡到顶层,我使用应用程序错误处理程序来处理它们。

如果我有一个特定的错误,我知道可以发生在一个函数中,并且该函数可以处理它,那么我就可以。

超时,对象引用没有设置等等到最高处理程序。

0

不要捕捉你无法做的事情。充斥着try/catch块的代码很难阅读,这意味着您的异常处理代码不包含在一个地方以方便维护。

如果你是刚刚登录异常或提醒用户,这应该在堆栈的顶部来完成(或者在您的应用层边界)。使用Application.ThreadException事件和AppDomain.CurrentDomain.UnhandledException事件并将它们挂接到Sub Main方法中的事件处理程序。