이 페이지에서이 예제 # 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
답변
방금 예외의 이름을 복사 한 것처럼 보였지만 포착하지 못한 정확한 문제가있었습니다. 내 어리석은 실수로 밝혀졌지만 같은 상황에 다른 누군가가있을 경우를 대비해 여기에 내 사례를 게시해야한다고 생각했습니다.
A 라는 네임 스페이스에 예외가 있었고 스크립트는 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
답변
\ 예외가 작동하지 않지만 해결책을 찾았습니다.
try {} catch (Exception $ e) {}를 try {} catch (Throwable $ e) {}로 대체해야했습니다.
자세한 정보 : https://trowski.com/2015/06/24/throwable-exceptions-and-errors-in-php7/
