PHP: добавить к выброшенному сообщению об исключении - PullRequest
1 голос
/ 06 января 2012

Возьмем следующую функцию в качестве примера того, что я хочу сделать:

public function save() {
    $this->connect('wb');
    try {
        if(!$this->lock())
            throw new Exception("Unable to acquire configuration locks");
        if (!$backup = $this->backup())
            throw new Exception("Failed to create configuration backup");
        try {
            if(!fwrite($this->_pointer, $this->dump("string")));
                throw new Exception("Error occured while writing to configuration");
            $this->unlock();
            $this->disconnect();
        } catch (Exception $e) {
            if(rename ($backup, $this->_file))
                $e .= PHP_EOL."Successfully restored configuration from backup";
            else
                $e .= PHP_EOL."Failed to restore configuration from backup";
            $this->unlock();
            $this->disconnect();
            throw $e;
        }
    } catch (Exception $e) {
        echo PHP_EOL, $e->getMessage();
    }
}

У меня есть вложенные операторы try() и catch().Исключение выдается из самого внутреннего и перехватывается, затем я выполняю некоторые функции и выкидываю другое исключение.Обратите внимание, где я пишу $e .=, я понимаю, что это неправильный синтаксис.Я хочу добавить строку к исключению $e->getMessage().

Как мне поступить?

Ответы [ 3 ]

7 голосов
/ 06 января 2012

Создайте свой собственный класс исключений и создайте метод для добавления строки к сообщению.

<?php
class SuperException extends Exception
{
    public function AppendToMessage($msg)
    {
        // $this->message is inherited from Exception class,
        // where it is protected field (member) of the class
        $this->message .= $msg;
    }
}
?>
1 голос
/ 06 января 2012

Большинство объектно-ориентированных языковых платформ, поддерживающих обработку исключений, осознают необходимость этого предмета.Вы должны понимать, что Исключения не являются журналами того, что произошло.Скорее, они там, чтобы точно определить, где именно произошла ошибка.

Таким образом, не только тот синтаксис неправильный, но и сама идея нарушает дюжину принципов OOD.Вы должны ввести класс логгера, который собирает информацию об ошибках по мере вашего появления, и использовать исключения, чтобы точно определить события , которые необходимо записать.код:

$logger = new ErrorLogger();
try {
    :
} catch (Exception $e) {
    $logger->log($e);
}
0 голосов
/ 06 января 2012

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

public function save() {
    $this->connect('wb');
    $exceptionMessage = "";
    try {
        if(!$this->lock())
            throw new Exception("Unable to acquire configuration locks");
        if (!$backup = $this->backup())
            throw new Exception("Failed to create configuration backup");
        try {
            if(!fwrite($this->_pointer, $this->dump("string")));
                throw new Exception("Error occured while writing to configuration");
            $this->unlock();
            $this->disconnect();
        } catch (Exception $e) {
            if(rename ($backup, $this->_file))
                $exceptionMessage .= PHP_EOL."Successfully restored configuration from backup";
            else
                $exceptionMessage .= PHP_EOL."Failed to restore configuration from backup";
            $this->unlock();
            $this->disconnect();
            throw $e;
        }
    } catch (Exception $e) {
        echo PHP_EOL. $exceptionMessage . PHP_EOL . $e->getMessage();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...