主要的方法代码完全在try / catch里面:这是不好的做法吗?

通常我把所有的主要方法代码放在一个try / catch块中,如下所示:

public static void Main(string[] args) { try { // code } catch (Exception e) { // code } } 

我这样做是为了防止任何exception从程序逻辑的其余部分中跳出来,从而允许我做一些事情,比如将其显示到控制台,将其logging到文件等。但是,我被告知这是不好的做法。

你认为这是不好的做法吗?

在没有很好的理由的情况下在try / catch块中包装任何代码是不好的做法。

在.NET编程模型中,例外应该保留用于真正特殊的情况或条件。 你应该试着去捕捉你实际上可以做些什么的exception。 此外,你应该几乎不应该捕获基类System.Exception类(而是倾向于捕获更具体的,派生的exception类,你可以处理)。 如果在程序执行过程中遇到真正意想不到的exception,实际上应该会崩溃。

显然,“正确的”答案将不得不根据具体情况进行,具体取决于catch // code块中的// code占位符内部发生了什么。 但是,如果你要求一个通用的规则或“最佳实践”,你应该总是有一个特定的理由来捕捉exception,而不是把所有的代码放在一个巨大的try / catch块中,当然不用考虑它。

请注意,如果您只是试图捕获为logging或错误报告目的而可能发生的任何未处理的exception,则应该使用AppDomain.UnhandledException事件 。 这是一个通知事件,所以它不允许你处理这些exception,但它是在应用程序崩溃后实现日志logging或错误报告function的正确地方。


编辑:当我读到陈冠希的精彩博客“旧新事物”时 ,我注意到他最近发表了一篇关于类似话题的文章。 它特定于COM而不是.NET Framework,但关于error handling的一般概念同样适用于这两种环境。 我想我会从这篇文章中分享几篇gem,以支持我的[显然颇有争议的]意见。

历史上,COM放置了一个巨大的尝试/除了你的服务器的方法。 如果你的服务器遇到了通常是未处理的exception,那么巨大的try / catch会捕获它,并将其变成错误RPC_E_SERVERFAULT 。 然后将exception标记为已处理,以便服务器保持运行,从而“即使在遇到问题时也能保持服务器正常运行,从而提高健壮性”。

提醒你,这实际上是一种伤害。

发生未处理的exception意味着服务器处于意外状态。 通过捕捉exception,并说:“不要担心,这一切都很好”,最终导致运行中的服务器损坏。

[。 。 。 ]

捕获所有exception并让该过程继续运行假定服务器可以从意外故障中恢复。 但这是荒谬的。 你已经知道,服务器是不可回避的敬酒:它坠毁!

更好的办法是让服务器崩溃,以便在故障点捕获故障转储。 现在你有机会搞清楚发生了什么事情。

您可以[也应该]在他的博客上阅读整篇文章: 如何closuresCOM“有助于”绕过服务器的exception处理程序 。

如果你正在做最聪明的事情,你可以用这个错误,这是一个很好的做法。 这就是try / catch的意思。

如果您只是抛出错误(或者将其logging下来并扔掉) – 特别是如果您这样做,而不考虑exception的types – 这被认为是不好的做法。

这可能会提出一个问题:如果最聪明的事情是logging下来并丢弃它呢? 我想说这将是一个例外情况。 但是在实践中,我的代码会另外声明。 我想我沉迷于很多不好的做法。

我和Cody说了90%的东西。 有一些情况类似于您可能想要捕获系统exception的插件示例。 以下是另一个考虑使用WCF Web服务的示例。

目标 :即使遇到错误,也要使用服务并进行部署。 允许错误冒泡。

 public static bool DoRemoteWebServiceWork() { bool result; RemoteWebServiceClient client = new RemoteWebServiceClient(); try { result = client.DoWork(); client.Close(); } catch (Exception) { client.Abort(); //dispose throw;//This service is critical to application function. The application should break if an exception is thrown. //could log end point and binding exceptions to avoid ignoring changes to the remote service that require updates to our code. } return result; } 

目标 :即使遇到错误,也要使用服务并进行部署。 防止冒泡的错误。

 public static bool DoRemoteWebServiceWork() { bool result; RemoteWebServiceClient client = new RemoteWebServiceClient(); try { result = client.DoWork(); client.Close(); } catch (Exception) { client.Abort(); //dispose //throw; //This service is auxiliary to the applications primary function. We have no influence over the service and therefore cannot fix it. //could log end point and binding exceptions to avoid ignoring changes to the remote service that require updates to our code. } return result; } 

毫无疑问,是的,使用Exception类是一个糟糕的做法

您应该关心exception的types,而不是截断catch块的所有exception,防止它们通知系统错误。

Exception类是一个基类,是一个顶级的exception,可以在代码中捕获。 在catch块中使用最具体的例外,具体来说,只有你在try {…} catch {…}块中提出的代码才可以在该特定级别上有效地parsing(在函数,其中try … catch块被声明)

这取决于你如何处理错误。 如果你只是抓住所有的错误,似乎优雅地处理他们 – 不好的做法。 即使你只是在那里login,我会说这是不好的做法 – 在本地login。

如果你真的做了一些事情来恢复错误(例如,你自己扔,并知道该怎么办) – 我会投票确定:)