2

我们通常在实例化时设置消息,如下所示:

throw new Exception($msg);`

但是我的情况是,我将默认异常对象存储在实例变量中,并在对象的整个生命周期中使用它,如下所示:

throw $this->my_exception;

由于我正在重用同一个对象,我需要能够在抛出异常之前随时设置消息,你明白吗?

4

2 回答 2

6

创建自定义异常:

class MyException extends Exception
{
    public function setMessage($message) {
        $this->message = $message;
    }
}

然后你可以创建并抛出这个异常

$this->exception = new MyException;
// ...
$this->exception->setMessage('Bad stuff happened');
throw $this->expection;

虽然我真的不明白你为什么会做那样的事情。

于 2011-01-20T14:12:26.783 回答
4

不要那样做。它使跟踪异常变得更加困难(因为堆栈跟踪不包括重新抛出)。相反,如果您使用的是 5.3+,请使用该$previous参数并创建一个新异常:

throw new Exception("message", 0, $this->my_exception);

即使您使用的版本低于 5.3,您也可以扩展异常类并添加它...

编辑:好的,根据您的评论,我知道您现在要做什么。你想让你的类抛出一个可配置的异常。我会做的是在其中获取一个字符串类名并将其存储。$this->my_exception字符串也是如此。您应该在存储它之前验证它是一个异常类,因为您不能抛出不扩展自的东西Exception

if (!is_subclass_of($this->my_exception, 'Exception')) {
    //Error out, since you can't throw that class name
}

然后,该扔的时候:

$class = $this->my_exception;
throw new $class("MyMessage");

它仍然不是很好,因为异常应该具有语义意义(因此存在LogicExceptionand InvalidArgumentException),但如果这是一个要求,那不是一种可怕的方式(但预先实例化异常是一种可怕的方式)。 ..

于 2011-01-20T14:12:13.397 回答