它们之间的区别是什么
try { }
catch
{ throw; }和
try { }
catch(Exception e)
{ throw e;}我应该在什么时候使用其中一个呢?
发布于 2009-11-09 01:25:29
这些结构
try { ... }
catch () { ... } /* You can even omit the () here */
try { ... }
catch (Exception e) { ... }两者的相似之处在于,它们都会捕获在try块中抛出的每个异常(并且,除非您只是使用它来记录异常,否则应该是)。现在看看这些:
try { ... }
catch ()
{
/* ... */
throw;
}
try { ... }
catch (Exception e)
{
/* ... */
throw;
}
try { ... }
catch (Exception e)
{
/* ... */
throw e;
}第一个和第二个try-catch块是完全相同的,它们只是重新抛出当前异常,该异常将保留其“源”和堆栈跟踪。
第三个try-catch块是不同的。当它抛出异常时,它将更改源代码和堆栈跟踪,以便从包含该try-catch块的方法上的throw e行看起来异常是从此方法抛出的。
你应该使用哪一个?这真的取决于每个案例。
假设您有一个带有.Save()方法的Person类,该方法将把它持久化到数据库中。假设您的应用程序在某处执行Person.Save()方法。如果你的数据库拒绝救人,那么.Save()将抛出一个异常。在这种情况下,您应该使用throw还是throw e?好吧,这要看情况。
我更喜欢做的是:
try {
/* ... */
person.Save();
}
catch(DBException e) {
throw new InvalidPersonException(
"The person has an invalid state and could not be saved!",
e);
}这应该把DBException作为抛出的新异常的“内部异常”。因此,当您检查此InvalidPersonException时,堆栈跟踪将包含返回到Save方法的信息(这可能足以解决问题),但如果需要,您仍然可以访问原始异常。
最后一句话,当你期待一个异常时,你真的应该捕捉一个特定的异常,而不是一个通用的Exception,也就是说,如果你期待一个你应该更喜欢的InvalidPersonException:
try { ... }
catch (InvalidPersonException e) { ... }至
try { ... }
catch (Exception e) { ... }祝好运!
发布于 2009-11-09 01:20:05
第一个函数保留堆栈跟踪,而第二个函数重置堆栈跟踪。这意味着,如果您使用第二种方法,异常的堆栈跟踪将始终从该方法开始,并且您将丢失原始异常跟踪,这对于阅读异常日志的人来说可能是灾难性的,因为他永远找不到异常的原始原因。
当您想要向堆栈跟踪添加其他信息时,第二种方法可能很有用,但它的用法如下:
try
{
// do something
}
catch (Exception ex)
{
throw new Exception("Additional information...", ex);
}有一个blog post在讨论它们之间的区别。
发布于 2009-11-09 01:21:53
你应该使用
try { }
catch(Exception e)
{ throw }如果您想在重新抛出异常(例如日志记录)之前对其执行某些操作。孤单的抛出保留了堆栈的痕迹。
https://stackoverflow.com/questions/1697216
复制相似问题