我们通常在实例化时设置消息,如下所示:
throw new Exception($msg);`
但是我遇到的情况是我有一个默认的异常对象存储在一个实例变量中并在整个对象生命周期中使用它,如下所示:
throw $this->my_exception;
由于我重用了同一个对象,我需要能够在抛出异常之前随时设置消息,你知道吗?
答案 0 :(得分: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;
虽然老实说我不明白为什么你会这样做。
答案 1 :(得分:4)
不要那样做。它使得跟踪异常更加困难(因为堆栈跟踪不包括重新抛出)。相反,如果您使用的是5.3+,请使用$previous
parameter并创建一个新例外:
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
和InvalidArgumentException
),但如果它是一个要求,那不是一种可怕的做法(但是 - 实例化异常是一种可怕的方式)...