对于.NET中的许多方法,它们可能抛出的异常可能多达7-8个( XmlDocument中的一个或两个方法,我认为Load()就可以抛出这么多异常)。
这是否意味着我必须编写8个catch块来捕获所有这些异常(最好使用特定的异常块来捕获异常,而不仅仅是一个类型为exception的通用catch块)。
如何使用此信息?
谢谢
发布于 2010-03-23 07:08:39
简单地捕获异常是控制程序流程的一种方法。一般来说,捕获特定异常比捕获更通用的异常类型(一直到Exception)更好,这是正确的,但这并不意味着捕获所有异常是有意义的。某些异常根本不应该被捕获;在这种情况下,您应该有一些错误报告系统来通知您这种真正的异常行为。
我倾向于捕获异常,我可以为其提供一些追索权。因此,我将捕获特定的异常,在这些异常中,我可以向用户(或调用者)提供一些有用的信息,或者当执行一些额外的逻辑是有意义的时候。但通常情况下,最好让某些异常根本不被处理。存在许多.NET异常(例如ArgumentNullException )是为了通知程序员编程错误,而不是通知用户某些不正确的行为。
发布于 2010-03-23 07:07:23
通常,不要捕获异常,除非您可以对其采取一些措施。让它冒泡到调用者。如果你想捕获异常只是为了提供信息,那么你可以再次抛出它:
try
{
// some code
}
catch (SomeSpecificExceptionThanYouCanHandle ex)
{
// This is an exception I can do something about
// so I'll do something intelligent
}
catch (Exception ex)
{
Logger.Error("Exception in SomeMethod: " + ex.Message);
throw;
}因此,如果您调用的方法可能抛出8种不同的异常类型中的一种,请为您可以处理的异常类型添加catch块,并将其他异常类型留给调用者处理。如果您正在编写类库(也可能是其他情况),请不要忘记记录您的方法可能抛出的异常。
但在应用程序的“顶层”,情况并非如此。按钮单击的事件处理程序不应该以不受控制的方式使应用程序崩溃;在这里,您需要优雅地尝试做一些事情;捕获异常,记录它,告诉用户事情没有解决,并可能(如果必要)关闭应用程序。
发布于 2010-03-23 07:31:31
是的,最佳实践是有许多捕获,而不是使用一般的异常,fxcop等工具将在分析代码时确认这一点。在实践中,我看到的大多数是2-3个接球。
你可以查看你的对象资源管理器,看看哪个类派生了你的异常,并捕获父异常,而不是所有8种可能的异常。
实际上,看看你当前使用对象的方式可能失败的地方,通常只有一两个异常可能发生,然后你可以用一个通用的异常来跟进它。
捕捉异常不应该用来控制流程,它应该用来处理你的方法没有成功完成其工作所需的东西的情况。
在catch中,您通常会写入日志文件或系统的事件日志。你会写下这样的东西
string message =“从数据库检索产品时出错。系统报告: ex.Message”
或
string message =“从数据库检索产品时出错”
如果(ex.Number == 20) { message = message +“这可能表示无法建立到数据库的连接”}
message = message +“系统报告: ex.Message”
https://stackoverflow.com/questions/2496353
复制相似问题