백엔드 개발 PHP7 php7의 오류 및 예외 처리

php7의 오류 및 예외 처리

Aug 12, 2020 am 10:41 AM
php7

오류

프로그램을 작성할 때 오류는 피할 수 없습니다. 오류를 찾고 수정하는 방법은 과학입니다. 오늘은 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

php7에서 tcp 포트가 작동하지 않는 것을 감지했을 때 문제를 해결하는 방법 php7에서 tcp 포트가 작동하지 않는 것을 감지했을 때 문제를 해결하는 방법 Mar 22, 2023 am 09:30 AM

php5에서는 fsockopen() 함수를 사용하여 TCP 포트를 감지할 수 있습니다. 이 기능은 네트워크 연결을 열고 일부 네트워크 통신을 수행하는 데 사용할 수 있습니다. 그러나 php7에서는 fsockopen() 함수에 포트를 열 수 없거나 서버에 연결할 수 없는 등의 몇 가지 문제가 발생할 수 있습니다. 이 문제를 해결하기 위해, 우리는 소켓_create() 함수와 소켓_연결() 함수를 사용하여 TCP 포트를 감지할 수 있습니다.

php7.0에 플러그인이 설치되어 있는데 여전히 설치되지 않은 것으로 표시되면 어떻게 해야 합니까? php7.0에 플러그인이 설치되어 있는데 여전히 설치되지 않은 것으로 표시되면 어떻게 해야 합니까? Apr 02, 2024 pm 07:39 PM

PHP 7.0에서 설치된 플러그인이 표시되지 않는 문제를 해결하려면: 플러그인 구성을 확인하고 플러그인을 활성화하세요. 구성 변경 사항을 적용하려면 PHP를 다시 시작하세요. 플러그인 파일 권한이 올바른지 확인하세요. 플러그인이 올바르게 작동하도록 하려면 누락된 종속성을 설치하세요. 다른 모든 단계가 실패하면 PHP를 다시 빌드하세요. 다른 가능한 원인으로는 호환되지 않는 플러그인 버전, 잘못된 버전 로드 또는 PHP 구성 문제 등이 있습니다.

php7.0에 mongo 확장을 설치하는 방법 php7.0에 mongo 확장을 설치하는 방법 Nov 21, 2022 am 10:25 AM

php7.0에서 mongo 확장을 설치하는 방법: 1. mongodb 사용자 그룹 및 사용자를 생성합니다. 2. mongodb 소스 코드 패키지를 다운로드하고 소스 코드 패키지를 "/usr/local/src/" 디렉터리에 넣습니다. "src/" 디렉터리를 입력합니다. 4. 소스 코드 패키지의 압축을 풉니다. 5. mongodb 파일 디렉터리를 생성합니다. 6. "mongodb/" 디렉터리에 파일을 복사합니다. 7. mongodb 구성 파일을 생성하고 구성을 수정합니다.

PHP 서버 환경 FAQ 가이드: 일반적인 문제를 신속하게 해결 PHP 서버 환경 FAQ 가이드: 일반적인 문제를 신속하게 해결 Apr 09, 2024 pm 01:33 PM

PHP 서버 환경에 대한 일반적인 솔루션에는 올바른 PHP 버전이 설치되어 있는지, 관련 파일이 모듈 디렉터리에 복사되었는지 확인하는 것이 포함됩니다. SELinux를 일시적으로 또는 영구적으로 비활성화합니다. 필요한 확장이 추가되고 올바르게 설정되었는지 확인하려면 PHP.ini를 확인하고 구성하십시오. PHP-FPM 서비스를 시작하거나 다시 시작합니다. 해결 문제에 대해서는 DNS 설정을 확인하세요.

php7.0을 설치하고 배포하는 방법 php7.0을 설치하고 배포하는 방법 Nov 30, 2022 am 09:56 AM

php7.0 설치 및 배포 방법: 1. PHP 공식 웹사이트로 이동하여 로컬 시스템에 해당하는 설치 버전을 다운로드합니다. 2. 다운로드한 zip 파일을 지정된 디렉터리에 추출합니다. 3. 명령줄 창을 열고 다음으로 이동합니다. "E:\php7" 디렉토리 "php -v" 명령을 실행하세요.

시스템 재시작 후 UnixSocket의 권한을 자동으로 설정하는 방법은 무엇입니까? 시스템 재시작 후 UnixSocket의 권한을 자동으로 설정하는 방법은 무엇입니까? Mar 31, 2025 pm 11:54 PM

시스템이 다시 시작된 후 UnixSocket의 권한을 자동으로 설정하는 방법. 시스템이 다시 시작될 때마다 UnixSocket의 권한을 수정하려면 다음 명령을 실행해야합니다.

php8과 php7 중 어느 것이 더 낫나요? php8과 php7 중 어느 것이 더 낫나요? Nov 16, 2023 pm 03:09 PM

PHP7과 비교하여 PHP8은 성능, 새로운 기능 및 구문 개선, 유형 시스템, 오류 처리 및 확장 측면에서 몇 가지 장점과 개선 사항을 가지고 있습니다. 그러나 사용할 버전을 선택하는 것은 특정 요구 사항과 프로젝트 상황에 따라 다릅니다. 자세한 소개: 1. 성능 향상, PHP8은 코드 실행 속도를 향상시킬 수 있는 JIT(Just-in-Time) 컴파일러를 도입합니다. 2. 새로운 기능 및 구문 개선, PHP8은 명명된 매개 변수 및 선택적 매개 변수 선언을 지원합니다. 함수 만들기 호출이 더 유연해졌습니다. 익명 클래스, 속성 유형 선언 등이 도입되었습니다.

Docker 환경에서 PECL을 사용하여 확장자를 설치할 때 오류가 발생하는 이유는 무엇입니까? 그것을 해결하는 방법? Docker 환경에서 PECL을 사용하여 확장자를 설치할 때 오류가 발생하는 이유는 무엇입니까? 그것을 해결하는 방법? Apr 01, 2025 pm 03:06 PM

Docker 환경을 사용할 때 Docker 환경에 Extensions를 설치하기 위해 PECL을 사용하여 오류의 원인 및 솔루션. 종종 일부 두통이 발생합니다 ...

See all articles