PHP 运行时或逻辑异常?

Posted

技术标签:

【中文标题】PHP 运行时或逻辑异常?【英文标题】:PHP runtime or logic exception? 【发布时间】:2012-12-19 18:02:29 【问题描述】:

php 中,如果一个值被认为是“未知”(不是本身无效),这是否应该引发逻辑或运行时异常?

<?php
function foo($bar) 
    // logic
    if(!is_string($bar)) 
        throw new \InvalidArgumentException('invalid *argument*');
    
    if(strlen($bar) < 4) 
        throw new \DomainException('invalid *bar*');
    
    static $knownBars = array('bar1', 'bar2');
    if(!in_array($knownBars)) 
        throw new \DomainException('unknown *bar*');
        //throw new \UnexpectedValueException('unknown *bar*');
    

    // runtime
    $bar;

前两个例外是显而易见的,但最后一个对我来说仍然有点不清楚。两者似乎都有道理;逻辑/域错误,因为我们期望定义的数据集之一,运行时/意外值错误,因为我们实际上得到了意外的值。

我应该扔哪一个?

另外,如果逻辑部分是单个 setter 方法,而我们想用数据库查找替换静态数组(数据集)... 是否可以预期由于数据库故障等导致逻辑代码中出现运行时异常? ?或者我们是否应该将数据库查找移动到运行时代码,如果“bar”被认为是未知的,仍然会抛出逻辑异常?

【问题讨论】:

(相关) OutOfRange vs OutOfBounds (相关)When would you use a DomainException 我参加聚会有点晚了,但我建议忘记 SPL 异常曾经存在,除非您需要捕获在 SPL 中某处抛出的异常(很少发生)。我正在尝试在这里建立一个更理智的层次结构:github.com/morrisonlevi/Ardent/blob/master/Exceptions.md 给出的答案是否解决了您的问题?如果是这样,请接受答案,以便将问题标记为已解决。如果没有,请更新您的问题并指出为什么到目前为止给出的答案都没有帮助。 【参考方案1】:

逻辑异常适用于编译时发生的错误。由于 PHP 在这个意义上没有编译时间,它通常被解释为“在开发过程中发生的错误”,(比如当开发人员忘记传递依赖或其他东西时),而运行时异常是针对不可预见的错误(通常源于用户输入)当代码运行时。

但坦率地说,整个 Spl Exception 层次结构是 Fubar。因此,只需使用您想要的或创建您自己的。

另见https://wiki.php.net/rfc/spl-improvements/exceptions

【讨论】:

创建你自己的.. 所以.. UnknownBarException 应该从 \LogicException 或 \Runtime.. 扩展。我猜我会使用逻辑,因为“未知 x”意味着有一个已知的数据集x. @RolandFranssen 来自异常。使用 RuntimeException 和 LogicException 的唯一原因是为了语义。 恕我直言 \DomainException (> Logic > Exception) as UnknownBar ALWAYS 意味着为条形图(域)定义了数据集,我喜欢保持这种语义。 @Roland DomainException 也很容易成为运行时异常,因为它指的是mathematical domain,例如函数的有效输入范围。如果用户提供的值超出该范围,则显然不是逻辑异常。 "如果用户提供值" 用户是谁?开发商?因为据我了解,开发人员在定义范围之外传递值/参数显然是一个逻辑错误。【参考方案2】:

我将使用 domain 作为这个数据集,因为数据集是静态的(因此在 setFoo() 中进行检查)...如果数据集我会使用 unexpectedvalue是动态的(因此签入doSomethingWithFoo())。

【讨论】:

以上是关于PHP 运行时或逻辑异常?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 程序上使用加载时或运行时动态链接时,如何在编译时解析引用?

一起搞懂PHP的错误和异常

我对运行时或编译时是否进行自动内存分配感到困惑

一起搞懂PHP的错误和异常

编译时异常与运行时异常的区别

异常,网络编程