繁体   English   中英

这两种处理异常的方式有什么区别

[英]What is the difference between these two ways of handling an exception

第一个:

for (i = 0; i < 100; i++)
{
   try { n = s.pop(); }
   catch (EmptyStackException e) { . . . }
   try { out.writeInt(n); }
   catch (IOException e) { . . . }
}

第二个:

try
{
   for (i = 0; i < 100; i++)
   {
      n = s.pop();
      out.writeInt(n);
   }
}
catch (IOException e) { . . . }
catch (EmptyStackException e) { . . . }

我知道通常我们使用第二种处理方式,但我试图理解为什么它更好。

在第一个示例中,如果您没有在 catch 块中抛出另一个异常,则循环将运行所有可能的多个异常。 否则,您将退出第一个异常的循环。

第二个示例将退出第一个异常的循环。

如评论部分所述,第一个示例将运行所有迭代,即使发生异常。 第二个示例将在发生口渴异常后停止。

同样,第一个示例可归因于故障安全,第二个示例可归因于快速失败。 你并不总是喜欢一个而不是另一个,你需要看看情况。
快速失败
故障安全

放置 try/catch 结构的位置绝对没有性能差异。 在内部,它们作为代码范围表在调用方法时创建的结构中实现。 当方法正在执行时,除非发生抛出异常,否则 try/catch 结构完全不在画面中,然后将错误的位置与表进行比较。

好吧,实际上只有在代码无异常运行时才没有性能差异。

其他答案中提到的差异,并不总是正确的 这完全取决于实现,特别是您将在 catch 块中执行的操作。 如果你在 catch 块中做了一些任务或者什么都不做,然后重新抛出异常,在这种情况下循环肯定会中断。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM