IT

PHP의 Try / Catch 블록이 예외를 적용하지 않습니다.

lottoking 2020. 9. 8. 08:16
반응형

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

반응형