Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.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
Php 在流程之前验证集合数据时,应使用哪个SPL异常?_Php_Oop_Design Patterns_Exception - Fatal编程技术网

Php 在流程之前验证集合数据时,应使用哪个SPL异常?

Php 在流程之前验证集合数据时,应使用哪个SPL异常?,php,oop,design-patterns,exception,Php,Oop,Design Patterns,Exception,我正努力想弄清楚什么时候该使用一些,特别是在下面的场景中 class MyClass { protected $data1; protected $data2; public function setData1($data1) { $this->data1 = $data1; } public function setData2($data2) { $this->data2 = $data2; }

我正努力想弄清楚什么时候该使用一些,特别是在下面的场景中

class MyClass {
    protected $data1;
    protected $data2;

    public function setData1($data1) {
        $this->data1 = $data1;
    }

    public function setData2($data2) {
        $this->data2 = $data2;
    }

    public function invokeProcess() {
        $this->validateData();
    }

    protected function validateData() {
        if(!$this->data1) {
            // Which Exception do I throw? See explanation below
        }

        if($this->data1 && $this->data2) {
            // Which Exception do I throw? See explanation below
        }
    }
}
我有一个被构造的类。然后,用户在对象上设置一些数据,并调用一个进程。这个过程要做的第一件事是验证对象上的数据,以确保所需的数据存在、数据组合正确等等,如果不存在,则需要抛出异常

那么我应该抛出哪些异常?

我的验证检查了两种情况真的

  • 缺少数据,即未设置的数据
  • 数据组合不正确
  • 对于#1,我在
    BadMethodCallException
    RuntimeException
    LogicException
    之间左右为难。对于#2,我认为这只是一个
    逻辑异常

    那么,我用哪一种呢

    注意:在任何人询问之前,我不能将所需数据作为构造函数中的参数,因为只有在设置其他数据时才需要某些数据,等等。

    如果必须使用SPL异常,那就是
    RuntimeException
    。这是指只能在运行时检测到的错误(例如错误的输入数据)

    LogicException
    将是一个不合适的选择,因为它不在它接收的数据中。当程序检测到必须始终为真的条件不成立时,可以将
    LogicException
    视为紧急按钮(与程序执行预期功能时应为真的条件形成对比)

    也不合适,因为它代表

    如果回调引用,则引发异常 对于未定义的方法,或者如果 缺少论点

    您的逻辑所需的某些数据可能丢失,但是如果没有正确数量的参数,就没有方法调用


    在您看来,我要么定义自己的异常(源自
    RuntimeException
    ),要么直接使用
    RuntimeException

    考虑到所有预先存在的异常似乎都不能满足您的需要,为什么不创建自己的异常?

    例如,您可以:

    • 一个名为
      ValidationException
      的超类,它将扩展
      Exception
    • 这将由两个子类继承:
      • ValidationException\u MissingData
      • validationexception\u BadCombination

    如果预先存在的SPL异常不适合您的情况,那么您不必使用它们:exceptions mecanism功能强大,可以让您定义您需要的任何东西——例如,大多数框架都是这样做的



    有关方法的更多详细信息,请参见。

    我个人会在每个
    集合*()
    方法中加入一个。

    我认为这些异常都不适合您的情况。你为什么不声明你自己的
    ValidationException
    ?我不必使用SPL,我只是不认为当其中一个SPL异常符合条件时扩展和创建我自己的异常有什么意义。我同意,
    Runtime
    BadMethodCall
    似乎是最好的选择。斯蒂芬:我写过,
    BadMethodCall
    不是一个好的选择:)是的,我重新阅读了定义,发现了这一点。就定义而言,
    RuntimeException
    绝对是正确的选择。再次感谢。但是SPL InvalidArgumentException适用于您的程序接收到错误输入数据的情况。它扩展了逻辑异常。你怎么解释呢?我已经解释过了,但这验证了正在设置的数据,而不是在调用流程时它是否存在并且与其他数据组合有效。而且你还必须对记录使用
    UnexpectedValueException
    InvalidArgumentException