2017-12-13 20 views
3

신뢰할 수있는 소스를 찾을 수 없어 __destruct() 안에 예외가 발생할 수 있습니다.소멸자 메서드에서 예외를 throw

이것은 PHP 문서는

Attempting to throw an exception from a destructor (called in the time of script termination) causes a fatal error.

을 말하는 것입니다하지만 그것

class A 
{ 
    public function __destruct() 
    { 
     throw new \Exception(); 
    } 
} 

try { 
    $a = new A(); 

} catch(\Exception $x) { 
    var_dump($x); 
} 

을 테스트 할 때 사실이 아니다 것으로 보인다. 나는 예외를 던지고 잡는다. 그래서 의사가 왜이 전화 번호를 얻었습니까? 마크 베이커의 대답 후 편집

는 :

실제로 작동

예외가 발생하고 소멸자에서 잡힐 수 있습니다. 나는 문서가 왜 그 다음에 있는지 아직도 불확실하다.

+1

소멸자의 모든 예제 코드에서 호출되지 않는; try [unsetting'$ a'] (https://3v4l.org/qYe67) 예외가 발생합니다 –

+1

그렇지 않으면 스크립트가 종료 될 때 예외가 throw됩니다. 하지만 그건 당신의 try/catch –

+0

의 '스크립트 종료시 호출 된'힌트입니다. –

답변

4

소멸자가 스크립트에서 아무 곳에서나 호출되지 않으므로 try/catch 블록이 아무 것도 포착하지 않습니다. try/catch 블록 안에 unset($x)이 있으면 예외가 발생하여 제대로 잡히게됩니다.

class A { 
    public function __destruct() { 
     throw new \Exception(); 
    } 
} 

try { 
    $a = new A(); 
    unset($a); 
} catch(\Exception $x) { 
    var_dump($x); 
} 

그렇지 않으면 스크립트가 종료 될 때 PHP에서 예외가 발생합니다,하지만 당신의 try/catch 블록의 외부

편집

예외 개체가 'hasn 경우 스크립트 종료에 던져 객체를 파괴하는 PHP의 내부 종결 처리를 시도하거나 포착 할 수 없으므로 수동으로 삭제 된 객체는 발견 할 수 없습니다. 이것은

Fatal Error: Uncaught Exception

그래서이 문서는 당신에게 경고하고 무엇 치명적인 오류가 발생 무엇에 대한

+0

테스트 해 보았습니다. 고맙습니다. 그런데 왜 그 문서가 거짓말인가? – user7808407

+0

내가 게시 한 코드를 실행하면'$ a'가 설정 해제되었을 때 발생하는 예외가 잡히고 var dumped [Demo] (https://3v4l.org/0jlBa) –

+0

맞아 편집했습니다. 내 의견이지만 빠르지 않아. 미안. – user7808407