【问题标题】:try{} catch(Exception e){} VS try{} catch(Exception e){ throw;} - What the difference? [duplicate]try{} catch(Exception e){} VS try{} catch(Exception e){ throw;} - 有什么区别? [复制]
【发布时间】:2014-06-26 13:09:29
【问题描述】:

我知道下一个代码是anti-pattern。对吗?

try
{
//something
} 
catch(Exception e)
{
//something
}

为什么更好用

try
{
//something
} 
catch(Exception e)
{
 //something
 throw;
}

?

我知道第二个变体用于重新引发异常(例如记录),但如果我需要重新引发相同的异常,为什么不使用下一个代码?

try
{
//something
} 
catch(Exception e)
{
 //something
 throw e;
}

【问题讨论】:

  • 如果您使用throw e; 而不是throw;,则不会保留堆栈跟踪(例如原始行号)。新的堆栈跟踪显示您的空 catch 块,这是不可取的。无论如何,一个空的捕获是不好的做法。

标签: c# anti-patterns


【解决方案1】:

这将重新抛出相同的异常并保留堆栈跟踪。这将使调试更容易。

catch(Exception e)
{
 //something
 throw;
}

这将重新引发异常,但您会丢失堆栈跟踪。

catch(Exception e)
{
 //something
 throw e;
}

这将默默地吞下异常。您只想在捕获特定异常而不是Exception 时执行此操作。您通常应该有充分的理由这样做。

try
{
//something
} 
catch(Exception e)
{
//something
}

【讨论】:

  • 从本质上讲,您永远不应该抛出您已按名称捕获的异常。您应该抛出一个新异常(可选地包括作为内部异常捕获的异常)或使用throw 不带操作数重新抛出
  • 您已经指出了示例 2 和示例 3 之间的区别,这已在 cmets 中链接的另一个问题中得到解决。提问者首先询问 1 和 2 之间的区别,并且仅在试图理解为什么 2 比 1 更好的情况下询问 2 和 3。
猜你喜欢
  • 2010-12-14
  • 2012-06-04
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
  • 2013-06-09
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多