在进程之前验证集数据时,我应该使用哪个SPL异常?

Ste*_*ose 3 php oop design-patterns exception

我正在努力解决何时使用几个PHP SPL异常,特别是在下面的场景中,

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个被构建的类.然后,用户在对象上设置一些数据,并调用进程.这个过程的第一件事是验证对象上的数据,以确保存在所需的数据,数据组合是否正确等,如果不是,则需要抛出异常.

那么我会抛出什么异常?

我的验证确实检查了两种情况,

  1. 缺少数据,即尚未设置的数据.
  2. 数据组合不好.

对于#1,我左右为难BadMethodCallException,RuntimeExceptionLogicException.对于#2,我认为它只是一个LogicException

那么,我使用哪些?

注意:在有人要求之前,我不能在构造函数中将所需数据作为参数,因为在设置其他数据时只需要一些数据等.

Jon*_*Jon 5

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

LogicException将是一个不恰当的选择,因为它指的是一个逻辑错误在你的程序,而不是在接收到的数据.想想LogicException作为一个紧急按钮,当您的程序检测到一个必须的条件永远是真不(对比这与一个条件应该是真实的程序来执行其预期功能).

BadMethodCallException 也不合适,因为它代表了一个

如果回调引用未定义的方法或缺少某些参数,则抛出异常.

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

在你的鞋子里,我要么定义自己的例外(衍生自RuntimeException),要么RuntimeException直接使用.