我有两个方法,一个是直接调用的,另一个是直接调用的,这两个方法都抛出了完全相同的两个异常(如果发生了错误的情况,不会声明我得到了异常)。
为此,我是否应该在每个try块中使用一条语句编写单独的try和catch块,并捕获这两个异常(当我检查MSDN类库引用时,这两个异常都可以处理,并且有一些我可以做的事情,例如,重新打开SqlConnection或运行一个查询而不是一个不存在的存储过程)。所以像这样的代码:
try
{
obj.Open();
}
catch (SqlException)
{
// Take action here.
}
catch (InvalidOperationException)
{
// Take action here.
}对于我紧跟其后调用的另一个方法也是如此。这似乎是一种非常混乱的编码方式。另一种方法是使用异常变量(在我使用AOP记录异常详细信息时省略它,使用一个类级属性)。这样做可以帮助我找出是哪种方法导致了异常,然后采取相应的措施。这是最好的方法,还是有另一种最佳实践?
我还假设,因为只抛出了这两个方法,所以我不需要捕获异常,因为这将是我无法处理的异常(导致我无法控制)。
谢谢
发布于 2010-03-27 05:53:32
除非您能以合理的方式处理异常并从错误中恢复,否则您不应该捕获异常。考虑到这一点,您应该选择不捕获这些异常,或者应该捕获它们并做一些有用的事情并继续。
假设您正在尝试执行后一种操作:处理错误并继续,那么无论两个语句中的哪一个失败,执行相同的操作真的有意义吗?假设您拥有以下内容:
try {
f1();
f2();
} catch (FooException) {
// Recover from error and continue
}
f3();在这种情况下,如果f1()失败,并且您从错误中恢复,f2()将永远不会被执行-它将直接转到f3()。这真的是你想要的吗?也许有时候是这样。但通常不是这样。
更有可能的情况是,在f1()出现错误后,您要么希望完全退出并返回错误,要么希望恢复并继续执行f2()。如果是这样,那么您将需要两个单独的try/catch块。
如果您对恢复不感兴趣,而只是记录异常,那么最简单的方法是让它们传播并在更高级别(但在您的程序崩溃或变得不可用之前)捕获它们,并记录消息和堆栈跟踪。这确保您将记录所有异常,并避免在每个可能抛出的方法中插入try/catch和日志记录代码。
https://stackoverflow.com/questions/2526934
复制相似问题