PHP의 Try / Catch 블록이 예외를 적용하지 않습니다.
이 페이지 에서이 예제 # 1을 실행합니다 : http://php.net/manual/en/language.exceptions.php
<?php
function inverse($x) {
if (!$x) {
throw new Exception('Division by zero.');
}
return 1/$x;
}
try {
echo inverse(5) . "\n";
echo inverse(0) . "\n";
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
// Continue execution
echo "Hello World\n";
?>
그러나 원하는 출력 대신 다음을 얻습니다.
0.2
Fatal error: Uncaught exception 'Exception' with message 'Division by zero.'
in xxx:
7 Stack trace: #0 xxx(14): inverse(0) #1 {main} thrown in xxx on line 7
내가 사용하고 개발자 환경입니다 UniServer 3.5
함께PHP 5.2.3
방금 예외의 이름을 복사 한 것처럼 보였지만 발견하지 못했습니다. 내 어리석은 실수로 밝혀졌지만 같은 상황에 다른 누군가가있을 가능성이있는 경우를 대비해 여기에 내 사례를 게시해야한다고 생각했습니다.
라는 네임 스페이스에 예외가 있었고 펼쳐는 B 라는 네임 스페이스에있었습니다 . 문제는 A \ MyException 이 (PHP에서) \ B \ A \ MyException (내 펼쳐가 B 라는 이름 공간에 있기 때문에 )가 모든 것입니다. 이 문제를 해결하기 위해 백 슬래시 (또는 호출 된 이름)를 추가하여 다음과 보이게하는 것입니다. \ A \ MyException
꽤 오래된 질문이지만 ...
나도이 문제가 있었지만 (그게 내가이 문제를 해결 방법이다) 간단한 실험으로 해결을 수 있었다. 그냥 변경 시도 Exception
에 \Exception
. 나를 위해 일했습니다!
편집하다 :
Sivann이 주석에서 지적했듯이 네임 스페이스를 사용하면 동일한 작업을 수행해야합니다. 선언 use \Exception as Exception;
할 것 같다 .
catch(\Exception $e)
대신 용도 catch(Exception $e)
. 잘 모르는 코드를 사용하는 경우, 특히 프레임 워크를 사용하는 경우 기본 PHP 예외를 자체적으로 무시할 수 있습니다. 넣으면 그냥 \Exception
기본 PHP 예외를 포착하고 있다는 것을 확신합니다.
C # (Csharp)과 같은 다른 언어에서 할 수있는 것처럼 PHP에서 일반적인 try {} catch {} 블록을 사용할 수 없습니다.
이렇게하면 :
try{
//division by zero
$number = 5/0;
}
catch(Exception $ex){
echo 'Got it!';
}
'Got it!'이 표시되지 않습니다. 절대 메시지. 왜? PHP는 항상 "Thrown"이 될 예외가 필요하기 때문입니다. 자체 오류 핸들러를 설정하고 예외를 발생시켜야합니다.
set_error_handler 함수 참조 : http://php.net/manual/es/function.set-error-handler.php
내 이니셜은 포착 / 던지는 예외의 이름에 오타가 있지만 코드가 정확히 동일하다면 정확히 무슨 일이 일어나고 있는지 잘 모르겠습니다.
원본 스크립트를 다음과 같이 수정하고 결과를 붙여 넣으십시오. 문제를 좀 더 잘 진단하는 데 도움이됩니다.
<?php
//set up exception handler to report what we didn't catch
function exception_handler($exception) {
if($exception instanceof MyException) {
echo "you didn't catch a myexception instance\n";
} else if($exception instanceof Exception) {
echo "you didn't catch a exception instance\n";
} else {
echo "uncaught exception of type: ".gettype($exception)."\n";
}
echo "Uncaught exception: " , $exception->getMessage(), "\n";
}
//install the handler
set_exception_handler('exception_handler');
class MyException extends Exception {
}
function inverse($x) {
if (!$x) {
throw new MyException('Division by zero.');
}
else return 1/$x;
}
try {
echo inverse(5) . "\n";
echo inverse(0) . "\n";
} catch (MyException $e) {
echo 'Caught myexception: ', $e->getMessage(), "\n";
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
// Continue execution
echo 'Hello World';
?>
다음 구성에서 동일한 문제가 발생했습니다.
PHP 5.2.14 (cli) (빌드 : 2010 년 8 월 12 일 17:32:30) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2010 Zend Technologies with eAccelerator v0.9.5. 1 , Copyright (c) 2004-2006 eAccelerator, by eAccelerator
해결책은 eAccelerator를 비활성화하거나 업데이트하는 것입니다. 두 가지를 모두 시도했고 두 가지 수정 사항이 모두 작동했습니다. 버그는 https://eaccelerator.net/ticket/242(NB . firefox가 SSL 인증서에 대해 불만을 표시 함 )에보고됩니다 .
이제 다음 구성으로 올바르게 try catch를 실행하고 있습니다.
PHP 5.2.4 (cli) (빌드 : 2007 년 10 월 16 일 09:13:35) Copyright (c) 1997-2007 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies with eAccelerator v0.9.6. 1 , Copyright (c) 2004-2010 eAccelerator, by eAccelerator
Xdebug에는 설정이 있습니다.
xdebug.show_exception_trace = 1
이것은 try catch 블록에서도 예외를 출력하도록 PHP를 강제합니다. 이것을0
설치했을 수있는 특정 타사 확장 프로그램을 비활성화 해보십시오. http://bugs.php.net/bug.php?id=41744
\ 예외가 작동하지 않지만 해결책을 찾았습니다.
try {} catch (Exception $ e) {}를 try {} catch (Throwable $ e) {}로 대체해야했습니다.
자세한 정보 : https://trowski.com/2015/06/24/throwable-exceptions-and-errors-in-php7/
참고 URL : https://stackoverflow.com/questions/2172715/try-catch-block-in-php-not-catching-exception
'IT' 카테고리의 다른 글
Gmail 및 NodeJS를 사용하는 Nodemailer (0) | 2020.09.08 |
---|---|
클래스 클래스 JavaScript (0) | 2020.09.08 |
Ruby에서 DateTime.now를 UTC로 어떻게 변환합니까? (0) | 2020.09.08 |
UIActivityIndicator의 크기를 어디에 있습니까? (0) | 2020.09.08 |
Flash가 설치되어 있는지 확인하고있는 경우 사용자에게 알리는 숨겨진 div를 표시해야 할 것입니까? (0) | 2020.09.08 |