异常处理程序

时间:2012-03-10 00:09:21

标签: php oop exception exception-handling

我必须开发一个异常处理程序,它应该处理5种不同类型的异常。我们只是简单地称他们为Ex1Ex2Ex3 ...

我虽然做了一个名为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 ...

以不同方式管理每个不同的异常

但这对我来说似乎不是一个好习惯。好吗?有没有其他方法这样做? 我应该创建Ex1HandlerEx2HandlerEx3Handler ......吗?我的S.O.L.I.D精神告诉我这里有些不对劲。它是什么?

1 个答案:

答案 0 :(得分:1)

在我回答这个问题之前我需要注意,程序程序员会看到这个并认为它是愚蠢的:)但我可以忍受这一点,这是假设一个OOP应用程序使用HTML模板输出在output_buffer被清理之后。< / p>

我总是在一次调用中创建一个包含大部分代码的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());
}

无论如何,这是一个粗略的想法,希望它有所帮助。