私はこれに答える前に注意する必要があります。手続き型プログラマがこれを見て、それがダムだと思うでしょう:)しかし、これはoutput_bufferが消去された後に出力されるHTMLテンプレートを持つOOPアプリケーションを想定しています。
私は通常、開発中にoutput_bufferを開始するだけでなく、他のファイルを要求し始めるところで、大抵のコードを1回の呼び出しで取り囲むtry/catchブロックを作成します。
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ブロックに捕らえられています。 、
try {
$html = new BasicTemplate($temp,$path);
} catch {CustomExceptionHandler $e) {
throw new Exception("Message: {$e->getMessage()} Other Info: {$e->getOtherVars()}",$e->getCode());
}
とにかくラフアイデアだ、それが役に立てば幸い:
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;
}
}
}
今すぐあなたの例外をキャッチし、それを再スローする必要があります。
ここであなたのロジックを考えようとしていますが、かなり複雑です(例外処理のための余分なコードがたくさんあります)。私はカスタム例外ハンドラを各クラス(ファイナル以外)に作成する傾向があります。例外をキャッチすると、自分のカスタムエラーハンドラから作成された顧客エラーメッセージ、エラーコード、バックトレースの標準例外としてそれらを再現します。このようにして、すべての例外を取り上げ、拡張された例外ハンドラでメソッドを呼び出すことによって、必要に応じてコードにドリルダウンすることができます。 –
@DavidBarker、これらの例外の1つは、PDOによってスローされるPDOExceptionです。私はすべてのコードまたはすべてのPDO関数をtry-catchブロックでラップすることができないので、それを捕まえて処理する方が簡単だと思います。ではない? – Shoe
私はPHPについてはあまりよく分かりませんが、オーバーロードされた "レンダリング"メソッドが便利だと思われます。例外をキャッチすると、その型がわかります。 PHPがオーバーロードをサポートしていない場合は、renderEx1、renderEx2などを作成できます。 – dsboger