Прежде чем ответить, я должен отметить, что процедурные программисты будут смотреть на это и думать, что это глупо :), но я могу с этим смириться, это предполагает, что ООП-приложение с 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());
}
В любом случае, это грубая идея, надеюсь, она поможет.