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
}
}
}
我有一个被构造的类。然后,用户在对象上设置一些数据,并调用一个进程。这个过程要做的第一件事是验证对象上的数据,以确保所需的数据存在、数据组合正确等等,如果不存在,则需要抛出异常
那么我应该抛出哪些异常?
我的验证检查了两种情况真的
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
)