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

标签 php oop design-patterns exception

我正在努力思考何时使用两个 PHP SPL Exceptions ,具体在以下场景中,

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. 缺失数据,也就是未设置的数据。
  2. 数据组合不当。

对于 #1,我在 BadMethodCallExceptionRuntimeExceptionLogicException 之间左右为难。对于 #2,我认为它只是一个 LogicException

那么,我使用哪些?

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

最佳答案

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

LogicException 将是一个不合适的选择,因为它 refers to a logic error in your program ,而不是在它接收到的数据中。当您的程序检测到必须始终为真的条件不是时,将 LogicException 视为紧急按钮(将其与应该 对于程序执行其预期功能而言是真实的)。

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

Exception thrown if a callback refers to an undefined method or if some arguments are missing.

您的逻辑需要的一些数据可能会丢失,但是没有正确数量的参数就没有方法调用。

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

关于php - 在流程之前验证集数据时,我应该使用哪个 SPL 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5245453/

相关文章:

php - 在PHP中显示Elasticsearch查询的所有汇总结果

php - 如何测试设置 protected 属性的构造函数?

python - 为什么我允许 pickle 是 Theano 函数的实例方法,而不是普通的实例方法?

java - java中的反射,方法继承

java - 访问者模式的目的与示例

java - 这是否被视为 "Database as an IPC"反模式?

design-patterns - 为您的应用程序选择端口的指南

php - mysql - 选择对多个表进行计数、按周分组、自定义日期范围

php - 按字母顺序对数组进行排序php

oop - 当您单独设计对象模型时,您使用什么技术?