сообщение о настройке обработки исключений php после этого
Обычно мы устанавливаем сообщение при создании экземпляра, например:
throw new Exception($msg);`
Но я нахожусь в ситуации, когда у меня есть объект исключения по умолчанию, хранящийся в переменной экземпляра, и я использую его в течение всего срока службы объектов, примерно так:
throw $this->my_exception;
Поскольку я повторно использую один и тот же объект, мне нужно иметь возможность установить сообщение в любое время, прежде чем выбрасывать исключение, понимаете?
2 answers
Не делай этого. Это усложняет отслеживание исключения (поскольку трассировка стека не будет включать повторный бросок). Вместо этого, если вы используете 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
), но если это требование, это не ужасный способ сделать это (но предварительное создание исключения - ужасный способ сделать это)...
Создайте пользовательское исключение:
class MyException extends Exception
{
public function setMessage($message) {
$this->message = $message;
}
}
И затем вы можете создать и создать это исключение
$this->exception = new MyException;
// ...
$this->exception->setMessage('Bad stuff happened');
throw $this->expection;
Хотя, честно говоря, я не понимаю, зачем тебе вообще делать что-то подобное.