我必须开发一个异常处理程序,它应该处理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精神告诉我这里有些不对劲。它是什么?
答案 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());
}
无论如何,这是一个粗略的想法,希望它有所帮助。