在维护我同事的代码时,甚至有人声称自己是高级开发人员,我经常看到以下代码:

try
{
  //do something
}
catch
{
  //Do nothing
}

或者有时他们将日志信息写入日志文件,例如下面的try catch块

try
{
  //do some work
}
catch(Exception exception)
{
   WriteException2LogFile(exception);
}

我只是想知道他们所做的是不是最好的做法?这让我很困惑,因为在我看来,用户应该知道系统发生了什么。


当前回答

没有任何参数的捕获只是简单地吃掉异常,没有任何用处。如果发生致命错误怎么办?如果不带参数地使用catch,就无法知道发生了什么。

catch语句应该捕获更具体的异常,如FileNotFoundException,然后在最后捕获Exception,它将捕获任何其他异常并记录它们。

其他回答

你唯一应该让用户担心代码中发生的事情的时候是他们是否可以或需要做一些事情来避免这个问题。如果他们可以更改表单上的数据、按下按钮或更改应用程序设置以避免这个问题,请让他们知道。但是用户无法避免的警告或错误只会让他们对你的产品失去信心。

异常和日志是为您,即开发人员,而不是最终用户准备的。当您捕捉到每个异常时,了解正确的做法要比仅仅应用一些黄金规则或依赖于应用程序范围的安全网要好得多。

盲目的编码是唯一一种错误的编码。事实上,您觉得在这些情况下可以做一些更好的事情,这表明您对良好的编码进行了投资,但避免试图在这些情况下确定一些通用规则,并首先了解抛出某些东西的原因,以及您可以做些什么来从中恢复。

没有任何参数的捕获只是简单地吃掉异常,没有任何用处。如果发生致命错误怎么办?如果不带参数地使用catch,就无法知道发生了什么。

catch语句应该捕获更具体的异常,如FileNotFoundException,然后在最后捕获Exception,它将捕获任何其他异常并记录它们。

我可以告诉你:

代码片段#1是不可接受的,因为它忽略了异常。(它像什么都没发生一样吞下去)。

所以不要添加不做任何事情或只是重新抛出的catch块。

Catch块应该增加一些价值。例如,向最终用户输出消息或记录错误。

不要对正常的流程序逻辑使用异常。例如:

例如输入验证。<-这不是有效的例外情况,而是你应该写方法IsValid(myInput);检查输入项是否有效。

设计代码以避免异常。例如:

int Parse(string input);

如果我们传递一个不能解析为int的值,这个方法会抛出一个异常,我们可以这样写:

bool TryParse(字符串输入,输出int结果);<-该方法将返回布尔值,表示解析是否成功。

也许这有点超出了这个问题的范围,但我希望这将帮助您在涉及try {} catch(){}和异常时做出正确的决定。

更好的方法是第二种(指定异常类型的方法)。这样做的好处是,您知道这种类型的异常可以发生在您的代码中。您正在处理这种类型的异常,您可以继续。如果出现任何其他异常,那么这意味着有错误,这将帮助您找到代码中的错误。应用程序最终会崩溃,但你会知道你错过了什么(bug),需要修复。

有时需要处理与用户无关的异常。

我的方法是:

在应用程序级别捕获未捕获的异常。在global.asax中)用于关键异常(应用程序可能没有用处)。这些例外情况我不太了解。只要在应用程序级别上登录它们,让系统完成它的工作。 捕捉“on place”并向用户显示一些有用的信息(输入错误的数字,无法解析)。 抓住位置,对边缘问题什么都不做,比如“我将在后台检查更新信息,但服务没有运行”。

它绝对不需要成为最佳实践。: -)