сообщение о настройке обработки исключений php после этого


Обычно мы устанавливаем сообщение при создании экземпляра, например:

throw new Exception($msg);`

Но я нахожусь в ситуации, когда у меня есть объект исключения по умолчанию, хранящийся в переменной экземпляра, и я использую его в течение всего срока службы объектов, примерно так:

throw $this->my_exception;

Поскольку я повторно использую один и тот же объект, мне нужно иметь возможность установить сообщение в любое время, прежде чем выбрасывать исключение, понимаете?

Author: fabio, 2011-01-20

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

 4
Author: ircmaxell, 2011-01-20 14:32:42

Создайте пользовательское исключение:

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

И затем вы можете создать и создать это исключение

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

Хотя, честно говоря, я не понимаю, зачем тебе вообще делать что-то подобное.

 6
Author: NikiC, 2011-01-20 14:22:06