2017-10-04 1 views
0

나는 이미이 질문을하는 기존 질문을 찾고 있었지만, 내가 알아 내려고하는 질문을 찾을 수 없었다. 내가 찾을 수있는 가장 비슷한 질문했다이 : php 5.3 avoid try/catch duplication nested within foreach loop (code sandwich) 내가 근무 장소가 PHP 백 엔드와 웹 응용 프로그램을 가지고 있도록PHP에서 클래스의 여러 메소드에서 동일한 try/catch 코드를 반복하는 것을 피할 수있는 방법이 있습니까?

좋아요. 우리는 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가 파이썬과 같은 데코레이터 구문을 지원하지 않는다는 것을 알고 있지만 개념적으로 구상하고있는 것을 보여주기 위해; 나는 코드가 더 이런 식으로 뭔가를 작동하려면 다음 @DefaultErrorHandling 데코레이터가 표준 시도/캐치의 각 방법을 포장 할

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에 트레이스에서 수집하는 정보가 아직 없습니까? 참조 : Exception::getTrace 어쩌면 buildErrorMessage 더하지

? 어쨌든, 나는 사용자 정의 예외 처리기가 당신이 무엇인지 추측합니다.

+0

아마 내가 생각하는 것을 얻는 가장 좋은 방법이라고 생각합니다. 감사! –

0

이 문제를 해결할 더 좋은 방법이 있는지 확실하지 않지만 로그를 형식화 한 로깅 클래스를 만들었습니다. 그런 다음 내 catch 블록에서 이것을 호출했습니다.

올바른 클래스 및 방법, i를 debug_backtrace() 기능을 로그인합니다. 자세한 내용은 answer을 참조하십시오.

0

컨트롤러 메서드를 호출하는 진입 점은 해당 호출을 try/catch로 래핑 할 수 있습니다. 즉, 이러한 메소드에서 다른 유형의 오류 핸들러를 사용하려는 경우, 기본 제어기에서 (또는 특성을 사용하여) 각 특정 메소드에서 호출해야하는 핸들러를 추적하는 무언가를 구현할 수 있습니다. 예 :

<?php 

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

또는 조치 방법 본문의 처음에 전화하십시오. 이러한 유형의 구성을 클래스 내에서 유지하면 가독성이 향상됩니다. 파이썬 예제처럼 깔끔하지는 않지만 설정 파일의 어느 곳보다 낫다.

더 많은 일반 오류 처리기가 다른 사람에 의해 언급 set_exception_handler를 사용하여 PHP에서 구현 될 수있다.

왜 이러한 요구 사항이 필요한지 알 수 없습니다.

관련 문제