例外作为控制机制

时间:2009-11-20 13:14:09

标签: exception language-design

我正在阅读这篇文章并笑了http://mcfunley.com/239/exceptions-are-not-a-control-mechanism

在我的一个应用程序中,我不使用File.Exist甚至我的EXPECT文件存在很多时间。我尝试创建一个文件而不覆盖旧版本,如果失败,我将重命名为Filename(Try Number).ext并循环直到它打开。

在这种情况下我应该使用File.Exist吗?或者我应该继续尝试打开文件,循环直到我然后写模式?

5 个答案:

答案 0 :(得分:2)

在我看来,由于以下几个原因,通常应将例外保留用于真正的例外情况:

  1. 异常具有高性能开销(尽管在处理文件时可能不会出现问题)
  2. 让应用程序吞噬并吞下大量异常会使调试变得非常困难
    • 您可能会吞下您正在寻找的异常
    • 这可能会让其他人难以遵循程序流程,特别是如果例外情况在call-hierarchie中被提升得更高
  3. 当然,在您的特定情况下,依赖于异常可能是有意义的,因为事先检查File.Exitsts()并不能保证文件在访问时存在,因此您可能必须包含异常情况< / p>

答案 1 :(得分:1)

这个问题被称为LBYL与EAFP:在你跳跃之前看看比宽容更容易要求宽恕。有many disussions of this topic here in SO

答案 2 :(得分:1)

我暂时将整个“特殊情况例外”的事情放在一边,只是简单地分析一下你的情况,以便说服它是正确的,你应该只在特殊情况下使用例外。

在你的情况下,你似乎在做

while (!opened) { 
   try {
       <file_open>;
       opened = true
   } catch (exception) {
       //ignore
   }
}

你最终很容易吃掉所有的CPU时间。如果你这样做

while (!opened) { 
   if (file.exists) {
       <file_open>
       opened = true
   } else {
       Thread.sleep(<some_time>);
   }
}

你会玩得很好,将你未使用的时间用于其他进程并将CPU保持在最低限度

所以在我看来,我会说首先测试一个非常好的主意。

答案 3 :(得分:0)

我建议检查File.Exist,否则异常路径可能会非常昂贵。

答案 4 :(得分:0)

例外情况适用于特殊情况。

你需要的只是一个测试;没有什么特别的,所以请使用File.Exist。