代码之家  ›  专栏  ›  技术社区  ›  Franck Freiburger

出于非错误目的使用异常

  •  5
  • Franck Freiburger  · 技术社区  · 17 年前

    使用异常来管理不是错误的案例是一种好的做法吗?

    就像在JavaScript和Python中管理生成器中的StopIteration情况一样(yield关键字)。

    9 回复  |  直到 17 年前
        1
  •  8
  •   Matt Price    17 年前

    卓越的

        2
  •  11
  •   Fredrik Mörk    17 年前

    通常不会,ASP。NET将其用于 Response.Redirect -实际上中止线程,然后捕获异常并重置它。这很讨厌,但 让您基本上“退出”请求,而不会让堆栈的每一层都意识到它需要立即返回。

    尽可能避免。如果你认为你绝对

        3
  •  10
  •   Jon Skeet    17 年前

    这取决于语言。 每种语言都有自己的设计和习语。对于大多数语言,例外情况应该是例外。

    在C++、Java和C#等语言中,对其他任何东西使用异常都是非常糟糕的。

    wikipedia 文章:

    Python风格要求在出现错误情况时使用异常。Python中的传统做法是在实际使用文件或资源之前测试其访问权限,而不是继续尝试使用它,如果访问被拒绝,则捕获异常。

    例外情况也可以用作非本地控制权转移的一种更通用的手段,即使不存在错误。例如,用Python编写的Mailman邮件列表软件在决定拒绝消息或保留消息以供主持人批准时,使用异常跳出深度嵌套的消息处理逻辑。

        4
  •  3
  •   chikak    17 年前

    顾名思义,例外情况只应在特殊情况下使用。我不会用它来管理非错误情况。

        5
  •  2
  •   Bombe    17 年前

    号码

    例外情况只能用于特殊情况(顾名思义)。这意味着:错误。

    • 呃,我找不到这个文件。-例外!
    • 呃,我不能除以0。-例外!
    • 结果是2.5。”-也不例外!
        6
  •  2
  •   chaos    17 年前

    这是一种非常值得怀疑的做法。如果你觉得不管怎样,这对你的情况都是最好的,一定要详细记录和评论,以保持你的 WTF/m 下来。

        7
  •  2
  •   George Kangas    16 年前

    在我写的数独求解器中,如果谜题是 解决 .

    主搜索函数是一个私有方法,通过对其自身进行递归调用,下降到搜索树中。这 案例是未能解决谜题,导致呼叫者只能正常返回;这 卓越的 case是解决谜题的成功,在这种情况下,我们“抛出(解决方案)”一直到公共方法中的catch子句。

    这是Scheme中一个众所周知的习语,使用call/cc。我在C++程序中模仿了它。

    我很乐意听到任何人对这种方法的赞成或反对意见。

        8
  •  1
  •   Richard    17 年前

    号码

    通常,系统旨在快速处理非异常情况,而接受异常情况会影响性能。因此,抛出/捕获的许多异常将比传统构造慢。

        9
  •  1
  •   Ionuț G. Stan    17 年前

    我相信有时例外对构建有用 DSL s。我知道,这听起来很奇怪,但由于许多语言没有Ruby所具有的特性(return关键字是可选的,因为返回了最后一个求值表达式的结果),我们尽可能地使用它。

    例如,我最近试图构建一个小的JavaScript测试框架,我想让框架用户能够说:

    skip();
    pending("pending message");
    fail("failure message");
    

    return skip();
    return pending("pending message");
    return fail("failure message");
    

    这些函数将是抛出异常的库函数,例如SkipTest异常。唯一推荐使用它们的地方是测试方法内部。这些测试方法总是在try/catch块中执行,在该块中处理每种类型的异常,并根据异常采取适当的步骤。

    这里有一个小例子:

    $.it("should offer means to explicitly mark a spec as failed", function() {
        $.fail("this spec must fail");
    });