2013-08-20 4 views
3

이것이 일반적인 관행인지 알고 싶었습니다. 기본적으로 생성자는 실패시에 던지는 초기화 함수를 호출합니다. 내 생각은 실제 출력이 전송되는 곳이기 때문에 객체가 생성되는 곳으로 예외를 바로 되돌려 놓는 것이 의미가 있습니다.PHP가 생성자에서 예외를 다시 발생시킵니다.

이런 상황에서 "권장 사항"이 있습니까? 아니면 이것을하기위한 더 표준적인 방법이 있습니까?

<?php 
    class a { 
     private $x; 
     private $y; 
     function __construct($filename) { 
      try { 
       $this->x = $this->functionThatMightThrowException($filename); 
       $this->y = $this->doSomethingElseThatMightThrow(); 
      } 
      catch(InvalidArgumentException $e) { 
        throw $e; //is this a good practice or not??? 
      } 
      catch(Exception $e) { 
        throw $e; //again 
      } 
     } 

     //rest of class definition 
    } 

    // then somewhere else where the object is created and output is being sent 
    $fn = "blah.txt"; 
    try { 
    $a = new a($fn); 
    } 
    catch (InvalidArgumentException $e) { 
    //actually handle here -- send error message back etc 
    } 
    catch (Exception $e) { 
    //etc 
    } 
?> 
+0

왜 처음에 다시 잡으려고할까요? – PeeHaa

+0

저는 이것이 불필요하다고 말하고 싶습니다. 걱정마. 그들을 다시 던질 필요가없는 uncatched 통해 그들을 보자. – hakre

+2

특정 예외를 포착하지 않으면 실행 체인을 다시 트릭합니다. 동일한 예외를 포착하고 다시 던지는 것은 일반적으로 무의미합니다. 일반적으로 당신은 오직 당신이 실제로 처리하고 싶어하는 것을 잡아서 나머지는 다른 곳에서 다루기 위해 위층으로 흘려 보내 게합니다. 그것은 뷔페와 같습니다. 무언가를 먹고 싶지 않다면, 그것을 접시에 두지 마십시오. –

답변

5

의 코드의이 부분을 보자 :

:뿐만 아니라 Exception입니다

  try { 
      $this->x = $this->functionThatMightThrowException($filename); 
      $this->y = $this->doSomethingElseThatMightThrow(); 
     } 
     catch(InvalidArgumentException $e) { 
       throw $e; //is this a good practice or not??? 
     } 
     catch(Exception $e) { 
       throw $e; //again 
     } 

InvalidArgumentException 때문에이 코드 중복의 전형적인 경우입니다 당이-자체가 감소 될 수있다

  try { 
      $this->x = $this->functionThatMightThrowException($filename); 
      $this->y = $this->doSomethingElseThatMightThrow(); 
     } 
     catch(Exception $e) { 
       throw $e; //again 
     } 

이제는 좋은 연습인지 묻는 곳의 행이 사라졌습니다. 따라서 중복 된 코드를 제거하기위한이 체계적 접근법으로도 문제가 해결 될 수 있다고 생각합니다. 아니, 좋은 습관이 아니 었습니다. 그것은 코드 중복입니다.

다음으로 이미 언급 한대로 예외를 다시 던지는 것은 가치가 없습니다. 코드는 다음과 같이 축소 될 수 있습니다.

  $this->x = $this->functionThatMightThrowException($filename); 
     $this->y = $this->doSomethingElseThatMightThrow(); 

그래서 도움이되기를 바랍니다. 코드는 이전과 완전히 똑같지 만, 차이점이 없으며 항상 적은 코드 만 사용합니다.

+0

그래서 "$ A = new ($ fn);"주위에 try/catch 블록을 말하고있는 것입니다. 예외를 잡는 데 충분합니까? 예외가 생성 될 수 있으므로 생성자에서 try 블록을 추가 할 필요가 없습니다. –

+0

잘, * 충분 함 *을 정의하지만 PHP에서 예외가 일반적으로 어떻게 작동하는지 읽기 http://php.net/language.exceptions는 기본적으로 그러한 결론을 이끌어냅니다. – hakre

+0

함수가 특정 사건에 대해 InvalidArgumentException을 throw하고 다른 임의의 가능성보다 다르게 처리해야하기 때문에 다중 catch 블록이 있다는 것을 언급해야합니다. –

관련 문제