首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >try/catch/throw和try/catch(e)/throw e之间的区别

try/catch/throw和try/catch(e)/throw e之间的区别
EN

Stack Overflow用户
提问于 2009-11-09 01:18:15
回答 4查看 77.6K关注 0票数 104

它们之间的区别是什么

代码语言:javascript
复制
try { }
catch
{ throw; }

代码语言:javascript
复制
try { }
catch(Exception e)
{ throw e;}

我应该在什么时候使用其中一个呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-11-09 01:25:29

这些结构

代码语言:javascript
复制
try { ... }
catch () { ... } /* You can even omit the () here */

try { ... }
catch (Exception e) { ... }

两者的相似之处在于,它们都会捕获在try块中抛出的每个异常(并且,除非您只是使用它来记录异常,否则应该是)。现在看看这些:

代码语言:javascript
复制
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?好吧,这要看情况。

我更喜欢做的是:

代码语言:javascript
复制
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:

代码语言:javascript
复制
try { ... }
catch (InvalidPersonException e) { ... }

代码语言:javascript
复制
try { ... }
catch (Exception e) { ... }

祝好运!

票数 153
EN

Stack Overflow用户

发布于 2009-11-09 01:20:05

第一个函数保留堆栈跟踪,而第二个函数重置堆栈跟踪。这意味着,如果您使用第二种方法,异常的堆栈跟踪将始终从该方法开始,并且您将丢失原始异常跟踪,这对于阅读异常日志的人来说可能是灾难性的,因为他永远找不到异常的原始原因。

当您想要向堆栈跟踪添加其他信息时,第二种方法可能很有用,但它的用法如下:

代码语言:javascript
复制
try
{
    // do something
}
catch (Exception ex)
{
    throw new Exception("Additional information...", ex);
}

有一个blog post在讨论它们之间的区别。

票数 34
EN

Stack Overflow用户

发布于 2009-11-09 01:21:53

你应该使用

代码语言:javascript
复制
try { }
catch(Exception e)
{ throw }

如果您想在重新抛出异常(例如日志记录)之前对其执行某些操作。孤单的抛出保留了堆栈的痕迹。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1697216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档