2012-03-10 17 views
1

5つの異なるタイプの例外を処理する例外ハンドラを開発する必要があります。 例外ハンドラ

... 
} 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を使用して、それぞれ別の例外を管理しますのは、単に Ex1Ex2Ex3 ...このようにインスタンス化されます ExHandlerと呼ばれる単一のクラスを行うものの

私はそれらを呼ぶことにしましょう。 ..

しかし、それは私にとっては非常に良い方法ではないようです。いいですか?これを行う他の方法はありますか? Ex1HandlerEx2HandlerEx3Handler ...を作成する必要がありますか?私のS.O.L.I.Dの精神は、何かがここで間違っていると私に伝えます。それは何ですか?

+2

ここであなたのロジックを考えようとしていますが、かなり複雑です(例外処理のための余分なコードがたくさんあります)。私はカスタム例外ハンドラを各クラス(ファイナル以外)に作成する傾向があります。例外をキャッチすると、自分のカスタムエラーハンドラから作成された顧客エラーメッセージ、エラーコード、バックトレースの標準例外としてそれらを再現します。このようにして、すべての例外を取り上げ、拡張された例外ハンドラでメソッドを呼び出すことによって、必要に応じてコードにドリルダウンすることができます。 –

+0

@DavidBarker、これらの例外の1つは、PDOによってスローされるPDOExceptionです。私はすべてのコードまたはすべてのPDO関数をtry-catchブロックでラップすることができないので、それを捕まえて処理する方が簡単だと思います。ではない? – Shoe

+0

私はPHPについてはあまりよく分かりませんが、オーバーロードされた "レンダリング"メソッドが便利だと思われます。例外をキャッチすると、その型がわかります。 PHPがオーバーロードをサポートしていない場合は、renderEx1、renderEx2などを作成できます。 – dsboger

答えて

1

私はこれに答える前に注意する必要があります。手続き型プログラマがこれを見て、それがダムだと思うでしょう:)しかし、これは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; 
     } 
    } 
} 

今すぐあなたの例外をキャッチし、それを再スローする必要があります。

+0

ありがとうございます。私はこれを認めた。 :) – Shoe

+0

あなたは大歓迎です:) –

関連する問題