对于.NET中的许多方法,它们可能抛出的异常可能多达7-8(XmlDocument中的一个或两个方法,我认为Load()可以抛出这么多例外)。
这是否意味着我必须编写8个catch块来捕获所有这些异常(最好使用特定异常块捕获异常,而不仅仅是Exception类型的常规catch块)。
如何使用此信息?
由于
答案 0 :(得分:3)
一般情况下,不会捕获异常,除非您可以对此做些什么。让它冒泡到呼叫者。如果您想仅仅出于信息目的捕获异常,那么您可以再次重新抛出它:
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块,并让其他块供调用者处理。如果您正在编写类库(也可能是其他类),请不要忘记记录您的方法可能会抛出的异常。
在您的应用程序的“顶级”中,这并不完全正确。按钮单击的事件处理程序永远不会使应用程序以不受控制的方式崩溃;在这里你需要优雅地尝试做某事;捕获异常,记录它,告诉用户事情没有成功,并且可能(如果需要)关闭应用程序。
答案 1 :(得分:0)
捕获异常只是控制程序流程的一种方法。你说正确地说捕获特定异常比捕获更多通用异常类型(一直到Exception
)更好,但这并不意味着捕获所有异常是有意义的。某些例外不应该被困住;在这种情况下,你应该有一些错误报告系统,告诉你这种真正特殊的行为。
我倾向于捕捉异常,我可以提供一些追索权。因此,我将捕获特定的异常,我可以向用户(或调用者)提供一些有用的信息,或者何时执行一些额外的逻辑。但通常最好不要处理某些例外情况。存在许多.NET异常 - 例如ArgumentNullException
- 以通知程序员编程错误,而不是某些不正确行为的用户。
答案 2 :(得分:0)
是的,最佳做法是获得许多捕获,而不是使用一般例外,像fxcop这样的工具会在分析代码时确认这一点。在实践中,我看到大多数2-3次捕获。
您可以在对象资源管理器中查看哪个类派生您的异常并捕获父异常而不是所有8个异常。
实际上,看看你目前使用该对象的方式可能会失败,通常只会发生一两个例外,然后你可以用普通的例子来跟进。
不应该使用捕获异常来控制流,它应该用于处理一种情况,即你的方法没有成功完成它所需的工作。
在catch中,您通常会写入日志文件或系统的事件日志。你会写类似
的东西string message =“从数据库检索产品时出错。系统报告:ex.Message”
或
string message =“从数据库中检索产品时出错”
if(ex.Number == 20) { message = message +“这可能表示无法建立与数据库的连接” }
message = message +“。系统报告:ex.Message”