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

将异常用于非错误目的

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

    使用异常来管理非错误的案例是一个好的实践吗?

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

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

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

    在C++语言、Java语言和C语言中,对任何其他事物使用异常是非常糟糕的形式。

    在Python中,异常的使用频率更高,比如迭代的结束。尝试做你想做的事情,稍后处理异常,而不是验证输入(请求宽恕比许可更容易),这种模式有很多。例如,如果您想打开一个文件,在Java中,您可能首先检查它是否存在,然后打开它并检查是否有一个有效的流。在Python中,您将打开它并使用它。如果失败,您将处理异常。

    wikipedia 文章:

    每当出现错误情况时,python样式都会调用异常。与在实际使用文件或资源之前测试对其的访问不同,Python中的常规做法是继续尝试使用文件或资源,如果访问被拒绝,则捕获异常。

    异常也可以用作非本地控制转移的更通用的方法,即使在错误没有问题的情况下也是如此。例如,用python编写的mailman邮件列表软件在决定拒绝邮件或将其保留以供审阅者批准时,使用异常从深度嵌套的邮件处理逻辑中跳出来。

        2
  •  11
  •   Fredrik Mörk    15 年前

    我会自然而然地说不。例外应用于 例外 状态,不适用于常规程序流。

        3
  •  10
  •   Jon Skeet    15 年前

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

    尽可能避免。如果你认为你绝对 要做到这一点,咨询两位同事,介绍设计方案,并询问他们是否能以某种方式更干净地完成设计。如果你们中没有人能想出更好的解决方法,那就用大量的文档来完成。

        4
  •  3
  •   chikak    15 年前

    顾名思义,异常只能在异常情况下使用。我不会用它来管理非错误的情况。

        5
  •  2
  •   Bombe    15 年前

    不。

    异常只应用于异常情况(如名称所述)。这意味着:错误。

    • __uh,I can_trade the file._157;-exception!
    • __uh,I can_t divide by 0._-exception!
    • __uh,I can_t get no memory._-exception!
    • _结果是2.5。”-没有例外!
        6
  •  2
  •   chaos    15 年前

    这是一种非常可疑的做法。如果你觉得这对你的处境是最好的,不管怎样,一定要记录和评论它,以保持你的 WTF/m 下来。

        7
  •  2
  •   George Kangas    15 年前

    在我写的数独解算器中,如果问题是 解决了的 .

    主搜索函数是一个私有方法,它通过对自身进行递归调用而下降到搜索树中。这个 正常的 case是未能解决难题,这只会导致对调用方的正常返回;case 例外 case是解决难题的成功方法,在这种情况下,我们将“throw(solution)”一路抛出到公共方法中的catch子句。

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

        8
  •  1
  •   Richard    15 年前

    不。

    一般来说,系统设计用于快速处理非异常情况,而接受异常情况会影响性能。因此,许多被抛出/捕获的异常将比常规构造慢。

    它还使得分析和理解代码变得更加困难,而且大多数代码将大部分时间花在维护上。

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

    我相信有时候例外情况对建筑很有用 DSL 我知道,这听起来很奇怪,但是很多语言都没有Ruby的特性(返回关键字是可选的,因为返回了最后一个计算表达式的结果),所以我们尽可能地使用它。

    例如,我最近尝试构建一个小的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");
    });