сообщение о настройке обработки исключений php впоследствии - PullRequest
2 голосов
/ 20 января 2011

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

throw new Exception($msg);`

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

throw $this->my_exception;

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

Ответы [ 2 ]

6 голосов
/ 20 января 2011

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

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

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

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

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

4 голосов
/ 20 января 2011

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

...