Не делай этого.Это усложняет отслеживание исключения (так как отслеживание стека не будет включать перебрасывание).Вместо этого, если вы используете 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
и InvalidArgumentException
), но если это требование, это не ужасный способ сделать это (но предварительно создать экземплярисключение это ужасный способ сделать это) ...