2014-12-06 2 views
1

코딩하는 특성으로 인해 코드에서 재귀 함수로 인해 예외가 발생했습니다. 예외는 무시되고 대신 FALSE가 반환됩니다. 그래서 여기에 내 문제를 설명하기 위해 간단한 코드가 있습니다.PHP에서이 '최대 중첩 기능'예외를 잡을 수없는 이유는 무엇입니까?

function recursive() { 
    try{ recursive(); } 
    catch(Exception $e) 
    { echo "Error Caught!"; } 
} 
recursive(); 

'최대 기능 중첩 수준'100 '에 도달했습니다. 중단되었습니다.' 예외. 나는 try-catch의 작업을 오해 했습니까?

+3

'예외'입니까? 나는 그것이 '오류'라고 생각했고, 그 오류는 '치명적인 오류'였다. 따라서 fata 오류를 예외로 변환 할 수있는 오류 처리기가 없으면 캐치 할 수 없습니다. –

+0

저는 PHP에 대한 전문가가 아니므로 적용 할 수 있는지 잘 모릅니다. 그러나 예외를 고려하지 않으면 재귀는 꼬리 재귀이므로 최종 호출 최적화 될 수 있으므로 루프로 바뀌므로 옵티마이 저는 재귀를 루프로 전환했을 수 있습니다. –

+0

그래, 나는 Mark가 그것을 가지고 있다고 생각한다. 나는 이런 오류를 잡을 수 없다는 것을 전혀 모른다. – arch

답변

1

치명적 오류 및 예외가 아니기 때문에 시도 할 수 없으므로 & catch를 사용하십시오.

일반적으로 오류는 프로그램 실행을 계속해서 할 수 없으므로 폐지되어야 함을 의미합니다.

반면에 예외는 경고와 같습니다. 즉, 잘못된 것이 있음을 의미하지만이 예외를 올바르게 처리하면 프로그램 실행을 계속할 수 있습니다.

캐치 수는 입니다. 데이터베이스에 연결하려고 시도합니다 ... 데이터베이스 서버에 연결할 수 없기 때문에 connect가 예외를 throw합니다 ... 예외를 잡아서 잘 읽은 다음 물건을 읽을 수있게합니다. 캐시 된 파일에서. 예외 뒤에있는 의도는 개발자가 예외를 잡아두고 프로그램 실행을 계속하거나 중단하기를 원하는지 결정하게하는 것입니다.

+0

@ ρσ ݥ zση 답변 중 하나를 수락하십시오. 너. 고마워 – Benjamin

0

"PHP 치명적 오류 : 최대 기능 중첩 수준 '100'에 도달했습니다."

"치명적인 오류"입니다. 예외는 아닙니다. PHP에서 set_error_handler를 사용하여 Exception으로 변환 할 방법이 없습니다 (하위 수준의 오류를 예외로 변환하는 데 유용함).

"치명적인 오류"의 경우 error_get_last를 호출하고이 치명적인 오류가 발생했음을 인식 할 수있는 register_shutdown_function을 사용하여 정리 작업을 수행 할 수 있습니다. 그러나 당신이 할 수있는 모든 것, 설계된 프로그램 흐름을 계속할 방법이 없습니다.

BTW php.ini에서 XDebug 모듈을 활성화 한 경우에만이 치명적인 오류가 발생할 수 있습니다.

관련 문제