Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 什么是';例外';?_Oop_Exception - Fatal编程技术网

Oop 什么是';例外';?

Oop 什么是';例外';?,oop,exception,Oop,Exception,我想从单元测试或OOP原则的角度来定义“例外”。有几次,当我谈到异常抛出时,我看到一些评论,比如:“嗯,我不会考虑从酒吧得到FoO是例外。”(有没有表情表情?) 我在谷歌上搜索了一下,并没有马上得到答案。是否有比意见或偏好更客观的好定义、经验法则或指导方针?如果一个人说“这是例外”,另一个人说“不,不是”,那么如何解决这一争议 编辑:哇,所以已经有很多答案了,有不一致的评论,而且它们似乎都是回答者的意见:p没有人引用过维基百科页面或文章或灰胡子的片段。我从中得到的“元答案”是,对于何时使用异常

我想从单元测试或OOP原则的角度来定义“例外”。有几次,当我谈到异常抛出时,我看到一些评论,比如:“嗯,我不会考虑从酒吧得到FoO是例外。”(有没有表情表情?) 我在谷歌上搜索了一下,并没有马上得到答案。是否有比意见或偏好更客观的好定义、经验法则或指导方针?如果一个人说“这是例外”,另一个人说“不,不是”,那么如何解决这一争议



编辑:哇,所以已经有很多答案了,有不一致的评论,而且它们似乎都是回答者的意见:p没有人引用过维基百科页面或文章或灰胡子的片段。我从中得到的“元答案”是,对于何时使用异常,没有达成一致的经验法则。在选择抛出异常时,我更自信地使用自己的、个人的、特殊的规则。

一般的经验法则是:

  • 对您预计可能发生的错误使用异常
  • 使用断言处理可能永远不会发生的错误
如果:

  • 这是一种失效状态。及

  • 这种情况很少发生,而且 意外地及

  • 没有比这更好的机制了 报告它

  • 编辑

    Ken在这里发布了Dan Weinreb的文章,我想总结一下例外情况

  • 方法的契约定义了如何 (以及是否)异常情况 (即故障)发出信号。如果 方法说某物是一个 例外,就是这样。当然 这就留下了一个如何解决的问题 我们应该设计合同

  • 例外情况的好处是不存在 需要业主进行任何检查 来电者,以及自然 冒着气泡直到他们被抓到 一些能够处理它们的东西。他们 也可以包含重要的细节, 用户可读的文本和堆栈跟踪。 这些特性使它们非常适合于 防止进一步恶化的失败案例 处理,但不可预测 或者普通的,或者明确的 错误处理会造成中断 对流程进行编码。尤其是 适用于“永远不应该”的错误 发生“但在未来是灾难性的” 效果(例如堆栈溢出)

  • 标志、错误代码、魔法值 (NULL、nil、无效的\u句柄等) 还有其他基于回报的机制 不是强占流,而是 因此,更适合于各种情况 这是最常见的,也是处理得最好的 在当地,尤其是那些 失败是可以解决的。作为 他们按惯例行事,而不是按惯例行事 菲亚特,你不能指望他们 检测并处理,但 无效值可能被设计为 如果实际使用,则引发异常 (例如一个无效的\u句柄 习惯于阅读)

  • 在robust中使用异常时 代码,每个方法都应该捕获 意外异常并将其包装 在 合同。换句话说,如果你的 方法不能保证抛出 NullReferenceException,您需要 抓住它,把它放进去 更一般或更具体的东西。 它们被称为例外,而不是例外 惊喜


  • 我不同意其他关于需要“例外”才能保证“例外”的答案。我说的“例外”是指任何时候你想要通过向上传播的对象来打破正常的控制流


    异常是一种语言特性。它们是达到目的的手段。它们不是魔法。与任何其他功能一样,当您使用这些功能时,应以您需要它们所能提供的内容为指导,而不是以它们的名称为指导。

    IMHO,如果程序的进一步执行将导致致命错误或不可预测的行为,则应引发异常。

    就个人而言,我认为这种讨论纯粹是浪费时间,“什么是例外”是一个错误的问题

    异常只是另一种流控制机制,具有某些优点(控制流可以向上传递多个级别的调用堆栈)和缺点(有些冗长,行为不太本地化)


    它是否是正确的选择不应该由它的名字来决定。如果将异常简单地称为“bubbleups”,我们会进行这些讨论吗?

    当有人撕开电源弦时,这是异常情况,大多数其他情况都是可以预料到的。

    还有另一条很好的经验法则——永远不要使用异常捕捉代码中可以捕捉到的条件

    例如,如果有一个方法将两个变量相除,那么不要使用异常来捕获被零除的错误,而是事先进行必要的检查

    错误代码示例:

    float x;
    try {
    x = a / b;
    {
    catch (System.DivideByZeoException) {
    x = 0;
    }
    
    if (b == 0)
    return 0;
    
    好的代码示例:

    float x;
    try {
    x = a / b;
    {
    catch (System.DivideByZeoException) {
    x = 0;
    }
    
    if (b == 0)
    return 0;
    

    异常通常是昂贵的。

    我不想讨论异常是否应该用作流控制的圣战,而是要关注异常事件是什么

    Oracle在Java环境中是一个例外事件:

    异常是发生的事件 在程序执行期间, 这扰乱了正常的水流 程序指令

    当然,这个定义通常适用于异常,而不仅仅是Java

    这里的关键是“扰乱正常流程”。换句话说,程序失败的方式使它无法完成指令

    程序具有定义的功能范围。当您的程序的所有功能都被考虑(包括处理无效输入)时,剩下的任何东西都是异常,很可能是bug

    我相信有两种例外:

  • 程序员引入程序的bug
  • 无法控制的情况,比如某人