Обработчик исключений - PullRequest
       10

Обработчик исключений

1 голос
/ 10 марта 2012

Мне нужно разработать обработчик исключений, который должен обрабатывать как 5 различных типов исключений. Давайте назовем их просто Ex1, Ex2, Ex3 ...

Я, хотя и делаю один класс с именем ExHandler, который будет создан следующим образом:

...
} catch (Ex1 $e) { $h = new ExHandler($e); $h->render(); }
catch (Ex2 $e) { $h = new ExHandler($e); $h->render(); }
catch (Ex3 $e) { $h = new ExHandler($e); $h->render(); }
...

И внутри ExHandler по-разному управляйте каждым другим исключением, используя $e instance of Ex1, $e instance of Ex2, $e instance of Ex3 ...

Но это не кажется мне хорошей практикой. Это хорошо? Есть ли другой способ сделать это? Должен ли я создать Ex1Handler, Ex2Handler, Ex3Handler ...? Мой дух S.O.L.I.D говорит мне, что здесь что-то не так. Что это?

1 Ответ

1 голос
/ 14 марта 2012

Прежде чем ответить, я должен отметить, что процедурные программисты будут смотреть на это и думать, что это глупо :), но я могу с этим смириться, это предполагает, что ООП-приложение с HTML-шаблонизацией выводит после очистки output_buffer. 1001 *

Я всегда создаю блок try / catch, охватывающий большую часть моего кода за один вызов, обычно в тот момент, когда я начинаю требовать другие файлы, а также запускаю output_buffer во время разработки.

ob_start();

try {
    switch($appPage) {
        case('work'):
            require_once('im_bored_at_work.php');
            break;
        case('home'):
            require_once('im_a_little_less_bored_at_home.php');
            break;
        default:
            require_once('on_the_fence.php');
    }
} catch (Exception $e) {
    // Handle exception caught and apply formatting
}

$devOut = ob_get_contents();
ob_end_flush();

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

class CustomExceptionHandler extends Exception {

    private $msg;
    private $code;
    private $otherVars;

    public function __construct($msg,$code=0,$otherDebugVar=null){
        $this->msg = $msg != null ? $msg : "An unknown exception was thrown";
        $this->code = $code;
        $this->otherVars = $otherDebugVar;
        parent::__construct($msg,$code);
    }

    public function getOtherVars() {
        return $this->otherVars;
    }

}

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

class BasicTemplate {
    private $template;
    private $path;
    private $contents;

    public function __construct($template, $path) {

        $this->template = $template;
        $this->path = $path;
        $this->buildTemplate();
    }

    private function buildTemplate() {

        if ($contents = @file_get_contents($this->path . $this->template)) {
            $this->contents = $contents;
        } else {
            $e = new CustomExceptionHandler("Message",2,$this->path . $this->template);
            // Do whatever else you want to do with custom exception handling class
            throw $e;
        }
    }
}

Теперь вам нужно поймать свое исключение и сбросить его:

try {
    $html = new BasicTemplate($temp,$path);
} catch {CustomExceptionHandler $e) {
    throw new Exception("Message: {$e->getMessage()} Other Info: {$e->getOtherVars()}",$e->getCode());
}

В любом случае, это грубая идея, надеюсь, она поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...