主要的方法代码完全在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。
如果你真的做了一些事情来恢复错误(例如,你自己扔,并知道该怎么办) – 我会投票确定:)
- 有没有可能在java中捕捉到内存exception?
- ASP.NET自定义错误页面 – Server.GetLastError()为空
- android查看不附加到窗口pipe理器
- java.rmi.ServerException:在服务器线程中发生RemoteException(ClassNotFoundException)
- C ++是否支持“终于”阻止? (我听说过这个“RAII”是什么?)
- 自动编号与entity framework
- 在Java中,什么时候URL连接closures?
- java.rmi.NoSuchObjectException:表中没有这样的对象
- 我怎样才能在WinForms应用程序中捕获所有“未处理”的exception呢?