PHP에서 블록 시도/캐치 중 예외가 검출되지 않음
이 페이지에서 예 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라는 이름 공간에 스크립트가 있습니다.문제는 (PHP에서) \B\A\MyException과 동일한A\MyException이 있다는 것입니다(스크립트가 B!라는 네임스페이스에 있기 때문입니다).수정하려면 예외 이름에 백슬래시(또는 호출된 이름)를 추가하면 다음과 같이 됩니다.\ A \ My Exception
꽤 오래된 질문이긴 하지만...
저도 이 문제가 있었습니다(그렇게 해서 이 글을 알게 되었습니다).그러나 간단한 실험으로 해결책을 찾을 수 있었습니다. .Exception
로로 합니다.\Exception
한텐 먹혔어날위!!!!!
편집:
에서 지적한 하는 것도를 사용하는 것도 마찬가지입니다. 간단하게 , ★★★★★★★★★★★★★★★★★.use \Exception as Exception;
수업 신고하기 전에 말이야
''를 .catch(\Exception $e)
catch(Exception $e)
잘 모르는 코드를 사용하고 있는 경우, 혹은 특히 프레임워크를 사용하고 있는 경우, 디폴트의 PHP 예외의 어느 쪽인가에 우선하는 경우가 있기 때문에, 잘못된 패스로 이동해, 바람직하지 않은 결과를 얻을 수 있습니다. ★★★★★★★★★★★★★★★★★★★★★★★★★\Exception
PHP를 사용합니다.
C#(Csharp)과 같은 다른 언어에서는 일반적인 try{} catch{} 블록을 사용할 수 없습니다.
이렇게 하면:
try{
//division by zero
$number = 5/0;
}
catch(Exception $ex){
echo 'Got it!';
}
Got it!'이라는 메시지는 절대 볼 수 없습니다. 왜일까요?이는 PHP가 항상 "Thrown"이 되기 위한 예외가 필요하기 때문입니다.독자적인 에러 핸들러를 설정해, 예외를 발생시킬 필요가 있습니다.
set_error_module 함수를 참조하십시오.http://php.net/manual/es/function.set-error-handler.php
\Exception
나한테는 안 먹히지만 난 해결책을 찾았어
교체 필요:
try {
...
} catch(Exception $e){
...
}
타고
try {
...
} catch(Throwable $e){
...
}.
상세한 것에 대하여는, https://trowski.com/2015/06/24/throwable-exceptions-and-errors-in-php7/ 를 참조해 주세요.
PHP 7을 사용하는 경우 Exception 대신 Throwable이 필요할 수 있습니다.
처음은 당신이 잡고 있는 예외의 이름에 오타가 있다는 것입니다만, 만약 당신의 코드가 완전히 같다면, 무슨 일이 일어나고 있는지 정확히 알 수 없습니다.
원본 스크립트를 다음과 같이 수정하여 결과를 붙여넣습니다.문제를 더 잘 진단할 수 있습니다.
<?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';
?>
저 같은 경우에는 이상한 상황이 벌어져서Exception
와도 소용없었다\Exception
여기에서는, 어떠한 것도 빠뜨리지 않고, 항상 에러를 검출할 수 있도록 합니다.
catch (\Exception $e) {
// do what you want to do on exception catching
} catch (\Throwable $e) {
// do what you want to do on exception catching
}
이 두 가지를 결합하면, 여러분은 한 마리도 놓치지 않을 것입니다.Exception
꼭 넣어주세요.\
전에Exception
그리고.Throwable
.그것은 중요해요.
편집 이들을 효율적으로 잡는 방법은 다음과 같습니다.
catch (\Exception|\Throwable $e) {
// do what you want
}
두 개의 캐치블럭을 따로 두지 않고 잡을 수 있습니다.
다음 구성에서도 같은 문제가 있었습니다.
PHP 5.2.14 (cli) (구축:2010년 8월 12일 17:32:30) 저작권 (c) 1997-2010 PHP Group Zend Engine v2.2.0, 저작권 (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) 저작권 (c) 1997-2007 PHP Group Zend Engine v2.2.0, 저작권 (c) 1998-2007 Zend Technologies with eAccelerator v0.9.6.1, Copyright (c) 2004-2010 eAccelerator, by eAccelerator
php에서 모든 예외 발견
try
{
//place code
throw new Exception('foo');//eg
}
catch (\Throwable $e)
{
dd('for php 7');
} catch (\Exception $e)
{
dd('for php 5');
}
https://www.php.net/manual/en/language.exceptions.php
Xdebug에는 다음과 같은 설정이 있습니다.
xdebug.show_exception_trace = 1
이렇게 하면 try catch block에서도 php가 예외를 출력합니다.이것을 로 돌리다0
TLDR; 반드시 다음 조건을 충족해야 합니다.use Exception;
두 php 파일의 맨 위에 있습니다.
인스톨 했을 가능성이 있는 서드 파티의 확장 기능을 무효로 해 주세요.http://bugs.php.net/bug.php?id=41744
저도 이런 경험을 하고 있어요.나는 로윈슨 갤레고의 예외는 반드시 던져져야 한다는 코멘트를 읽었다.그래서 코드를 다음과 같이 수정했습니다.
try
{
$number = 5/0; //or other exception
}
catch(Exception $e)
{
throw $e;
}
다음과 같이 입력합니다.
try
{
$number = 5/0; //or other exception
}
catch(Exception $e)
{
throw new Exception($e->getMessage(),$e->getCode());
}
그건 효과가 있다.
클래스 전에 백슬래시를 추가합니다.다음은 예를 제시하겠습니다.
전에
try {
if ($this->customerAuth->authenticate($customerId, $password)) {
$this->session->loginById($customerId);
}
} catch(Magento\Framework\Exception\State\UserLockedException $e) {
return $this->respondWithCode('login', 401);
} catch (Magento\Framework\Exception\InvalidEmailOrPasswordException $e) {
return $this->respondWithCode('login', 401);
}
끝나고
try {
if ($this->customerAuth->authenticate($customerId, $password)) {
$this->session->loginById($customerId);
}
} catch(\Magento\Framework\Exception\State\UserLockedException $e) {
return $this->respondWithCode('login', 401);
} catch (\Magento\Framework\Exception\InvalidEmailOrPasswordException $e) {
return $this->respondWithCode('login', 401);
}
이 오래된 스레드가 다시...
try/catch block이 있는 파일에 예외 서브클래스가 포함된 파일은 필요 없습니다.
(작곡가의 자동 로드에 의한 것일 수도 있습니다) 이것은 '유형으로 해결할 수 없습니다'라는 오류를 초래하지 않았습니다.그리고 어떤 이유에서인지 예상된 네임스페이스(require_once가 없는 다른 파일)를 사용하여 예외가 생성되었습니다.하지만 잡히지 않았다.디렉토리 구조가 네임스페이스와 일치하지 않기 때문에 파일 내의 올바른 클래스를 try/catch와 함께 로드했지만 다른 네임스페이스에 로드했을 수 있습니다.
언급URL : https://stackoverflow.com/questions/2172715/try-catch-block-in-php-not-catching-exception
'sourcecode' 카테고리의 다른 글
MySQL: 테이블이 여러 개입니까, 열이 많은 테이블이 한 개입니까? (0) | 2022.09.21 |
---|---|
라라벨로 mysql에 접속하려면 어떻게 해야 하나요? (0) | 2022.09.21 |
PHP7.1 json_encode() 플로트 문제 (0) | 2022.09.21 |
MySQL의 특정 열에 값이 표시되는 횟수 (0) | 2022.09.21 |
Python에서 '//'를 사용하는 이유는 무엇입니까? (0) | 2022.09.21 |