【问题标题】:How to enable/disable exception handling for a class如何启用/禁用类的异常处理
【发布时间】:2015-03-15 12:42:06
【问题描述】:

我有一个处理异常错误的类,比如

class fooException extends Exception{}

class foo {

  public function bar($x){
    if(!$x){
        throw new fooException ("x can not be false value");
     }
  }

}

现在,我想要做的是允许类的用户选择是否应该抛出异常,或者不只是像 PDO 类一样。

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

所以,我要让班级灵活地不要一直抛出异常。

【问题讨论】:

  • 我认为您需要将实际的 throw new fooException 代码行包装到 if 语句中,然后分别。为您现有的条件添加另一个条件——例如if(!$x && THROW_EXCEPTIONS){ …,其中THROW_EXCEPTIONS 是一个设置为真或假的常量。
  • 到底是什么问题?例如,您可以设置一个静态变量并在决定抛出异常之前对其进行检查。
  • 没有问题@jeroen 我知道你可以用 if/else 做任何事情,但如果有另一种方法,我正在徘徊,因为我不熟悉异常类在基础之外的工作方式。跨度>
  • @CBroe 这似乎是个好主意。我必须在命名空间之后定义一个常量,然后默认将其设置为false,然后在抛出异常之前执行 if/else 进行检查。
  • “因为我不熟悉异常类是如何工作的”——这不是重点; 抛出异常发生在该类的“外部”,这就是您首先要在此处防止的。异常类的内部工作与此无关,只是因为当调用该类时,已经“为时已晚”。为了避免被车撞到,你不需要知道内燃机是如何工作的——你需要让你的 a$$ 远离道路;-)

标签: php oop exception error-handling exception-handling


【解决方案1】:

您可以以更好的方式扩展异常

class MyException extends Exception 
{
    static public $enable = true;
    public function __construct($message = null, $code = 0)
    {       
        if (self::$enable) {
            parent::__construct($message, $code);
        }
    }

}

你可以打电话

throw new MyException("x can not be false value");
MyException::enable = false; //for disable

请注意,这确实是非常基本的实现,您在以某种方式处理错误状态时遇到了问题。

另一个更好的解决方案是使用 ExceptionHandler

class ExceptionHanlder
{
    static public $enable = true;
    function __construct($message = null,$code = null) {
        if (self::$enable) {
            throw new Exception($message,$code);
        }
    }

}
ExceptionHandler::$enable = false;
new ExceptionHandler('test');

【讨论】:

  • 这样的事情应该可以做到,尽管我不确定抛出异常而不调用父构造函数的后果是什么。我可能会自己在foo 类中处理它,以避免完全抛出异常。
  • 完全同意,其他部分需要处理,我重新编辑代码
猜你喜欢
  • 1970-01-01
  • 2015-05-20
  • 2015-11-12
  • 1970-01-01
  • 2012-11-04
  • 2013-03-08
  • 1970-01-01
  • 2020-03-07
  • 2014-09-21
相关资源
最近更新 更多