> 백엔드 개발 > PHP7 > 본문

php7의 오류 및 예외 처리

齐天大圣
풀어 주다: 2023-02-17 17:20:01
원래의
2229명이 탐색했습니다.

오류

프로그램을 작성할 때 오류는 피할 수 없습니다. 오류를 찾고 수정하는 방법은 과학입니다. 오늘은 php7 이후의 오류와 예외에 대해 이야기하겠습니다.

오류 분류

일반 오류는 구문 오류, 런타임 오류, 논리 오류로 구분됩니다. 구문 및 런타임 오류는 해결하기 쉽지만 논리 오류는 그렇게 간단하지 않습니다. 나는 판단을 내릴 때 할당 연산 =에 비교 연산 ==을 여러 번 썼습니다. 일반적으로 경험이 많을수록(더 많은 함정을 밟을수록) 논리적 오류를 찾는 것이 더 쉬워집니다.

제어 오류 출력

일반적으로 개발 단계에서는 오류의 적시 감지를 용이하게 하기 위해 오류 출력을 켜는 것이 좋습니다. 안전과 미관을 위해 온라인 단계에서는 오류 출력을 끄는 것이 좋습니다.

php는 브라우저와 CLI에 대한 오류 출력을 제어하는 ​​매개변수 display_errors를 제공합니다. 이를 수정하는 방법에는 php.ini 파일을 수정하거나 ini_set 함수를 사용하는 두 가지 방법이 있습니다. 다음은 ini_set을 사용하여 마스킹 오류 출력을 설정하는 코드를 보여줍니다.

<?php
ini_set(&#39;display_errors&#39;, 0);

echo $a;
echo 0;
date();
echo 1;
로그인 후 복사

프로그램은 정상적으로 01을 출력하지만 오류 메시지는 출력하지 않습니다.

오류 보고 수준

은 일반적으로 4가지 주요 범주로 나뉩니다.

  • 구문 분석 오류

  • 오류 치명적인 오류

  • 경고 경고 수준 오류

  • 주의 레벨 오류

php.ini 구성 파일에는 출력되는 오류 수준을 제어하는 ​​데 사용되는 error_reporting 옵션이 있습니다. 일반적인 것에는 E_ALL, E_WARNING 및 E_NOTICE가 포함됩니다.

error_reporting() 함수를 통해 오류 수준 출력을 동적으로 제어할 수 있습니다.

# 输出所有级别错误
error_reporting(E_ALL);
# 输出所有级别除了E_NOTICE
error_reporting(E_ALL & ~E_NOTICE);
# 输出所有级别除了E_NOTICE和E_WARNING
error_reporting(E_ALL & ~(E_NOTICE | E_WARNING));
로그인 후 복사

display_errors와 error_reporting의 차이점

display_errors는 오류 출력 여부를 제어하는 ​​데 사용되고, error_reporting은 출력되는 오류 수준을 제어하는 ​​데 사용됩니다. 보통

ini_set(&#39;display_errors&#39;, 0); // 关闭错误输出
error_reporting(E_ALL);  // 输出所有级别的错误信息
로그인 후 복사

와 함께 사용하게 됩니다. 위 구성은 대개 온라인 단계에서 모든 오류 출력을 차단하지만 PHP 오류 로그에 오류를 기록합니다. 오류 로그의 경로는 error_log 옵션에 의해 결정됩니다.

error_reporting을 0으로 설정하면 오류가 출력되지 않거나 오류 로그가 기록됩니다.

오류가 프로그램에 미치는 영향

프로그램에 구문 오류가 있으면 프로그램이 실행되지 않습니다. 오류 수준 오류가 발생하면 프로그램은 하향 실행을 중지합니다. 공지 및 경고 수준 오류는 프로그램의 하향 실행에 영향을 미치지 않습니다.

error_reporting(E_ALL);  // 输出所有级别的错误信息

echo $a;
echo 0;
date();
echo 1;
new a;
echo 2;
로그인 후 복사

이 프로그램은 0과 1을 출력하지만 2는 출력하지 않습니다.

사용자 정의 오류

trigger_error() 함수는 사용자 수준 오류를 생성할 수 있습니다. 오류 수준에는 E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE 등이 포함됩니다.

<?php

trigger_error(&#39;这是notice级别错误&#39;, E_USER_NOTICE);
trigger_error(&#39;warning错误&#39;, E_USER_WARNING);
trigger_error(&#39;deprecated&#39;, E_USER_DEPRECATED);
trigger_error(&#39;error错误&#39;, E_USER_ERROR);
로그인 후 복사

맞춤형 오류 처리

set_error_handler - 사용자 정의 오류 처리 함수를 설정합니다. 함수 프로토타입은 다음과 같습니다.

set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] ) : mixed
로그인 후 복사

이 함수의 첫 번째 매개 변수는 콜백 함수입니다. , 프로토타입은 다음과 같습니다.

  • handler ( int $errno , string $errstr [, string $errfile [, int $errline [, array $errcontext ]]] ) : bool
    로그인 후 복사
    또는오류 수준

  • Erstr 오류 정보

  • errfile이 오류 파일을 보냈습니다.

  • Errline 오류, 사용자가 처리할 수 없는 다음 수준의 오류는 다음과 같이 정의됩니다. 사용자 : E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING 및 대부분의 E_STRICT는 set_error_handler() 함수가 호출되는 파일에서 생성됩니다.

    <?php
     
    define(&#39;DEBUG&#39;, false);
     
    set_error_handler(&#39;error_handler&#39;);
     
    if (DEBUG) {
        ini_set(&#39;display_errors&#39;, &#39;On&#39;);
    } else {
        ini_set(&#39;display_errors&#39;, &#39;Off&#39;);
    }
     
    function error_handler($errLevel, $errInfo, $errFile, $errLine)
    {
        echo "ErrorLevel:$errLevel: $errInfo In $errFile ON $errLine" . PHP_EOL;
    }
     
    echo $a;
    로그인 후 복사

예외

异常和错误时有区别的,错误一般是指我们能控制的问题,比如变量名写错了,或者判断条件写的不错,导致死循环。而异常通常指那些难以控制的、意料外的错误,比如mysql连接不上,文件句柄打开失败等情况。

php的异常也是经典的try catch finally,但和一般的异常处理不一样的是,绝大部分的异常需要自行抛出。抛出异常使用throw关键字完成。php也支持捕获多个异常。

<?php

class MyError extends Exception
{
    public function printErr ()
    {
        echo &#39;出错啦&#39;.PHP_EOL;
    }
}

class YourError extends Exception
{
    public function printErr ()
    {
        echo &#39;errors&#39;.PHP_EOL;
    }
}

try {
    if (mt_rand(0,1)) {
        throw new MyError(&#39;错误&#39;);
    } else {
        throw new YourError(&#39;错误&#39;);
    }


} catch (MyError $e) {
    $e->printErr();
} catch (YourError $e) {
    $e->printErr();
} finally {
    echo &#39;不管有没有异常,我都会被执行&#39;.PHP_EOL;
}
로그인 후 복사
로그인 후 복사

php的异常如果没有捕获,则会报Fatal Error错误,程序不会继续向下执行。

PHP 7 错误处理

PHP 7 改变了大多数错误的报告方式。不同于传统(PHP 5)的错误报告机制,现在大多数错误被作为 Error 异常抛出。 Error 和 Exception 都实现了 Throwable 接口

异常处理

设置默认的异常处理程序,有try/catch捕获的话这个异常函数就不会执行,反之就会执行异常处理函数,而且执行的话,脚本将不会继续执行。

php使用set_exception_handler来设置用户自定义的异常处理函数 ,函数原型如下:

set_exception_handler ( callable $exception_handler ) : callable
로그인 후 복사

回调函数的原型如下:

handler ( Throwable $ex ) : void
로그인 후 복사

下面,我们来写一个异常处理函数

<?php

class MyError extends Exception
{
    public function printErr ()
    {
        echo &#39;出错啦&#39;.PHP_EOL;
    }
}

class YourError extends Exception
{
    public function printErr ()
    {
        echo &#39;errors&#39;.PHP_EOL;
    }
}

try {
    if (mt_rand(0,1)) {
        throw new MyError(&#39;错误&#39;);
    } else {
        throw new YourError(&#39;错误&#39;);
    }


} catch (MyError $e) {
    $e->printErr();
} catch (YourError $e) {
    $e->printErr();
} finally {
    echo &#39;不管有没有异常,我都会被执行&#39;.PHP_EOL;
}
로그인 후 복사
로그인 후 복사

统一处理错误与异常

学完了错误与异常,知道如何去使用自定义错误处理和异常处理,现在我们就可以统一处理错误与异常了。

<?php
 
class Errors
{
    // 处理非致命错误
    static function errorHandle($errLevel, $errInfo, $errFile, $errLine)
    {
        echo &#39;错误:&#39;.PHP_EOL;
        print_r([&#39;file&#39; => $errFile, &#39;level&#39; => $errLevel, &#39;line&#39; => $errLine, &#39;info&#39; => $errInfo]);
    }
 
    // 处理致命错误及异常
    static function exceptionHandle(Throwable $ex)
    {
        echo &#39;异常:&#39;.PHP_EOL;
        print_r([&#39;file&#39; => $ex->getFile(), &#39;level&#39; => $ex->getCode(), &#39;line&#39; => $ex->getLine(), &#39;info&#39; => $ex->getMessage()]);
    }
}
 
set_error_handler([&#39;Errors&#39;, &#39;errorHandle&#39;]);
set_exception_handler([&#39;Errors&#39;, &#39;exceptionHandle&#39;]);
로그인 후 복사

위 내용은 php7의 오류 및 예외 처리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿