2017-10-04 74 views
0

我一直在尋找一個已經存在的問題,但是我沒有找到任何問題來問我想要弄清楚什麼。我能找到的最類似的問題是:php 5.3 avoid try/catch duplication nested within foreach loop (code sandwich)在PHP中,有一種方法可以避免在一個類的多個方法中重複相同的try/catch代碼?

好的,我工作的地方有一個帶PHP後端的Web應用程序。我們使用MVC類型的結構。我正在編寫一個擁有多個方法的控制器,並且在我的每個方法中,我都使用相同的try/catch代碼來包裝我的代碼。在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的裝飾器語法,只是爲了展示我在概念上構想的內容;我想要的代碼更喜歡這樣的行爲的內容:

class MyController { 

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

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

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

} 

凡@DefaultErrorHandling裝飾將包裹在標準的try/catch每個方法。有沒有一種方法可以實現這種行爲,所以我不必擁有所有這些具有重複代碼的方法?或者我想錯誤處理錯誤?

感謝任何花時間回答此問題的人。

回答

1

你看過寫一個自定義異常處理程序,並使用set_exception_handler

你在做什麼似乎有點像重新發明輪子。該異常是否已經沒有您在跟蹤中收集的信息?參見:Exception::getTrace

也許buildErrorMessage做的更多?無論如何,我假設一個自定義的異常處理程序就是你所追求的。

+0

我認爲這可能是獲得我要找的東西的最好方法。謝謝! –

0

不知道是否有更好的方法來解決這個問題,但我創建了一個記錄類,它爲我設置了日誌格式。然後在我的catch塊中調用它。

要記錄正確的類和方法,我需要debug_backtrace()函數。有關更多信息,請參閱此answer

0

調用控制器方法的入口點可以使用try/catch來包裝這些調用。話雖如此,如果您計劃在這些方法上使用不同類型的錯誤處理程序,那麼您可以在基本控制器中實現某些功能(或使用trait),以跟蹤應該在每種特定方法上調用哪個處理程序。類似於

<?php 

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

或者只是在操作方法體的開頭調用它。在類中保持這種類型的配置將有助於提高可讀性。不像python示例那樣整潔,但比配置文件中的某處更好。

通過使用其他人提到的set_exception_handler,可以在php中實現更一般的錯誤處理程序。

我真的不明白爲什麼會有這樣的要求。

相關問題