我们通常在实例化时设置消息,如下所示:
throw new Exception($msg);`
但是我的情况是,我将默认异常对象存储在实例变量中,并在对象的整个生命周期中使用它,如下所示:
throw $this->my_exception;
由于我正在重用同一个对象,我需要能够在抛出异常之前随时设置消息,你明白吗?
我们通常在实例化时设置消息,如下所示:
throw new Exception($msg);`
但是我的情况是,我将默认异常对象存储在实例变量中,并在对象的整个生命周期中使用它,如下所示:
throw $this->my_exception;
由于我正在重用同一个对象,我需要能够在抛出异常之前随时设置消息,你明白吗?
创建自定义异常:
class MyException extends Exception
{
public function setMessage($message) {
$this->message = $message;
}
}
然后你可以创建并抛出这个异常
$this->exception = new MyException;
// ...
$this->exception->setMessage('Bad stuff happened');
throw $this->expection;
虽然我真的不明白你为什么会做那样的事情。
不要那样做。它使跟踪异常变得更加困难(因为堆栈跟踪不包括重新抛出)。相反,如果您使用的是 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");
它仍然不是很好,因为异常应该具有语义意义(因此存在LogicException
and InvalidArgumentException
),但如果这是一个要求,那不是一种可怕的方式(但预先实例化异常是一种可怕的方式)。 ..