2017-10-04 15 views
0

私は既にこれを尋ねている既存の質問を探していましたが、私が把握しようとしていることをよく聞く質問は見つかりませんでした。私が見つけることができる最も類似した質問はこれでした:php 5.3 avoid try/catch duplication nested within foreach loop (code sandwich)PHPには、クラスの複数のメソッドで同じtry/catchコードを繰り返さないようにする方法がありますか?

私が働いている場所は、PHPのバックエンドを持つWebアプリケーションを持っています。 MVC型の構造体を使用します。私は複数のメソッドを持つコントローラを作成しています。それぞれのメソッドで、同じtry/catchコードでコードをラップしています。キャッチでは、例外、クラスへの参照、エラーメッセージを作成するメソッドへの関数への参照を渡し、エラーメッセージがアプリケーション全体で同じフォーマットになるようにします。

class MyController { 

    public function methodA() { 
     try { 
      // code for methodA 
     } catch(Exception $e) { 
      $errorMessage = Tasks::buildErrorMessage($e, __CLASS__, __FUNCTION__); 
      throw new Exception($errorMessage); 
     } 
    } 

    public function methodB() { 
     try { 
      // code for methodB 
     } catch(Exception $e) { 
      $errorMessage = Tasks::buildErrorMessage($e, __CLASS__, __FUNCTION__); 
      throw new Exception($errorMessage); 
     } 
    } 

    public function methodC() { 
     try { 
      // code for methodC 
     } catch(Exception $e) { 
      $errorMessage = Tasks::buildErrorMessage($e, __CLASS__, __FUNCTION__); 
      throw new Exception($errorMessage); 
     } 
    } 

} 

のでbuildErrorMessage関数がエラーメッセージをフォーマットコードを繰り返すことから、それぞれの方法を防ぎますが、実際には同じコードは、クラス内のすべての方法を通じ広がったについての私を悩ますものがある:それは、このものになります。私は、PHPがPythonのようなデコレータ構文をサポートしていないことを知っていますが、私が概念的に想定していることを実証するためだけです。 @DefaultErrorHandlingデコレータは、その標準のtry/catchで各メソッドをラップします

class MyController { 

    @DefaultErrorHandling() 
    public function methodA() { 
     // code for methodB 
    } 

    @DefaultErrorHandling() 
    public function methodB() { 
     // code for methodB 
    } 

    @DefaultErrorHandling() 
    public function methodC() { 
     // code for methodC 
    } 

} 

:私は、コードをよりこのような何かを動作するようにしたいです。私はこの動作を達成する方法があるので、これらのメソッドのすべてに繰り返しコードがある必要はありませんか?または、エラー処理について間違って考えていますか?

これに答える時間がかかる人に感謝します。

答えて

1

カスタム例外ハンドラを作成し、set_exception_handlerを使用しましたか?

あなたのやっていることは、車輪を改革するような感じです。例外には、トレースに収集している情報がまだありませんか?参照:Exception::getTrace

多分buildErrorMessageは何ですか?とにかく、私はカスタム例外ハンドラがあなたの後にあるものと仮定します。

+0

おそらく私が探しているものを得るための最良の方法だと思います。ありがとう! –

0

これを解決する良い方法があるかどうかはわかりませんが、ログをフォーマットしたログクラスを作成しました。それからちょうど私のキャッチブロックでこれを呼びました。

正しいクラスとメソッドを記録するには、私はdebug_backtrace()関数を使用します。詳細はanswerを参照してください。

0

コントローラメソッドを呼び出すエントリポイントは、これらの呼び出しをtry/catchでラップできます。つまり、これらのメソッドでさまざまな種類のエラーハンドラを使用する予定がある場合は、それぞれの特定のメソッドで呼び出されるハンドラを追跡する、何かをベースコントローラに実装することができます(または特性を使用します)。何かのように

<?php 

class MyController extends Controller 
{ 
    function __construct() 
    { 
     $this->setActionErrorHandler('function_name', 'handler'); 
    } 
} 

または単にアクションメソッドの冒頭でそれを呼び出してください。このタイプの設定をクラス内に保持すると、読みやすさが向上します。 Pythonの例と同じくらいうまくはないが、設定ファイルのどこかより優れている。

もっと一般的なエラーハンドラは、他の人が言及したset_exception_handlerを使ってPHPで実装できます。

私は本当にそのような要件がある理由は分かりません。

関連する問題