if else子句不能做什么,可以用异常处理来完成?

时间:2011-06-08 05:57:22

标签: exception-handling

使用if else子句无法做什么,可以通过异常处理来完成?

换句话说,我们实际上需要在哪里使用异常处理,如果其他方法不能用于此目的。

异常处理只是一种显示错误的美化方式吗?

7 个答案:

答案 0 :(得分:3)

在最早的C ++实现中,异常被编译成等效的if / else结构,或多或少。而且它们像糖蜜一样缓慢,以至于你仍然可以找到针对例外情况推荐的编程指南,理由是“它们很慢”。

所以这不是“可以”或“不能”的问题。这是一个可读性和性能的问题。

通过错误检查乱丢代码的每一行会使人更难以遵循非例外情况(即常见情况)。正如每位优秀程序员都知道的那样,代码的主要受众是人类读者。

至于性能,if / else 比现代异常实现慢。除非实际抛出异常,否则现代实现几乎没有开销。如果您的例外真正代表“例外”案例,那么这可能是一个显着的性能差异。

答案 1 :(得分:2)

某些语言(例如C ++)在某些情况下不允许返回值。例如,在C ++构造函数中没有返回值(偶数void),因此在构造函数中发出错误信号的唯一方法是抛出异常。

答案 2 :(得分:2)

看,对于手动编码的8086汇编程序无法做到的异常,你无法做任何事情。 (图灵完成!)除非手动编码的汇编程序对于100K代码行项目不是一个非常好的工具,除非你是银河系中最好的编码器,如果那样的话。经验表明,在许多情况下,异常处理的习惯用法产生了普通人编写的最强大的代码。 Sharptooth的ctors例子很好。那些需要传播调用堆栈的错误也是如此。 修改:有多少人实际检查malloc每次都没有失败?最好抛出OutOfMemoryException。

答案 3 :(得分:1)

例外就是它们的名称:特殊事件或破坏当前流量的情况。

你应该使用例外来表明发生了令人讨厌和非常特殊的事情。假设您有一个读取配置文件的类。特殊情况可能是:

  • 无法找到该文件。
  • 文件存在,但无法读取。
  • 文件已被删除 阅读操作。

可以使用if-else块处理所有这些,但是处理异常要简单得多。

答案 4 :(得分:1)

当然,您可以编写不使用异常的代码。但是,如果这样做,您将确保可以正确处理任何可能发出错误的函数。

对我来说,拥有异常的最大好处是我可以编写直接代码,只需假设所有函数都成功,知道上层将负责报告错误。

具体而言,请使用以下虚构函数在编辑器中处理文本:

do-stuff:
    backward-line 10
    x = point
    search-for "FOO"
    return buffer-substring x point

“后退”和“搜索”都可能失败。如果我必须自己处理错误,我将不得不检查它们。另外,我必须发明一个侧通道来向我的调用者报告发生了错误。正如我所说,它可以做到,但它会更加混乱。

答案 5 :(得分:0)

考虑以下现实生活中的例子。你有一个复杂的递归函数,需要在某些条件下退出当前正在进行的所有调用。

void complexFunction()
{
   //do stuff, then
   if( timeToBailOut() ) {
      // what? how would you get out of all instances at once?
   }       
}

您需要非常仔细地编写这些if语句,或者引入一个特殊的返回值,始终检查该值,这会使代码复杂化。您可以通过例外轻松实现该行为。

if( timeToBailOut() ) {
    throw BailOutException();
}

答案 6 :(得分:0)

没有任何事情可以通过异常处理来完成,如果没有它就无法完成,但是,某些情况在没有异常处理的情况下会很痛苦。

示例:a()调用b()b()来电c()c()中可能会发生错误,必须在a()中处理。在没有异常处理的情况下,您必须使用b()c()中的哨兵返回值以及b()中的额外检查代码来处理它。您可以想象,如果错误必须通过更多级别从导致错误处理的内容传递到需要处理它的内容,那么您需要编写多少代码。

这是我之前在此处提出并迁移的different question答案的简短版本。