ホームページ  >  記事  >  バックエンド開発  >  php7でのエラーと例外の処理

php7でのエラーと例外の処理

齐天大圣
齐天大圣オリジナル
2020-08-12 10:41:072154ブラウズ

エラー

プログラムを作成する場合、エラーは避けられません。エラーを見つけて特定し、修正する方法は科学です。今日は、php7 以降のエラーと例外について説明します。

エラーの分類

一般的なエラーは、構文エラー、実行時エラー、および論理エラーに分類されます。構文エラーと実行時エラーはトラブルシューティングが簡単ですが、論理エラーはそれほど単純ではありません。比較演算 == を代入演算 = として判定するときに何度も書いてきましたが、私のような人間には見つけるのが難しいです。一般に、経験を積むほど(落とし穴を踏む回数が増えるほど)、論理的な間違いを見つけるのが容易になります。

エラー出力の制御

エラーのタイムリーな検出を容易にするために、開発段階ではエラー出力をオンにすることが一般的に推奨されます。安全性と美しさのために、オンライン段階でのエラーをオフにします。

php は、ブラウザと cli へのエラーの出力を制御するパラメータ display_errors を提供します。これを変更するには、php.ini ファイルを変更する方法と、ini_set 関数を使用する方法の 2 つがあります。以下に、ini_set を使用してマスキング エラー出力を設定するコードを示します。

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

echo $a;
echo 0;
date();
echo 1;

プログラムは正常に 01 を出力しますが、エラー情報は出力しません。

#エラー報告レベル

一般に 4 つのカテゴリに分類されます

  • 構文エラーの解析

  • #error致命的なエラー
  • #警告警告レベルのエラー
  • #注意注意レベルのエラー

  • #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

error エラー レベル

    errstr エラーmessage
  • errfile 間違ったファイルを送信しました
  • errline エラーが発生した行番号
  • 次のレベルのエラーは、ユーザー定義関数で定義できません。処理対象: E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING、および set_error_handler() 関数が呼び出されるファイル内で生成されるほとんどの E_STRICT。
  • <?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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。