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

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

Aug 12, 2020 am 10:41 AM
php7

エラー

プログラムを作成する場合、エラーは避けられません。エラーを見つけて特定し、修正する方法は科学です。今日は、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 までご連絡ください。

ホット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ヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

php7がTCPポートが機能していないことを検出した場合の問題を解決する方法 php7がTCPポートが機能していないことを検出した場合の問題を解決する方法 Mar 22, 2023 am 09:30 AM

php5 では、fsockopen() 関数を使用して TCP ポートを検出できます。この機能を使用して、ネットワーク接続を開き、ネットワーク通信を実行できます。ただし、php7 では、fsockopen() 関数でポートを開けない、サーバーに接続できないなどの問題が発生する可能性があります。この問題を解決するには、socket_create() 関数とsocket_connect() 関数を使用して 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/" ディレクトリに配置します; 3. 「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 公式 Web サイトにアクセスして、ローカル システムに対応するインストール バージョンをダウンロードします; 2. ダウンロードした zip ファイルを指定したディレクトリに解凍します; 3. コマンド ライン ウィンドウを開いて、次のリンクに移動します。 「E:\php7」ディレクトリ 「php -v」コマンドを実行するだけです。

システムの再起動後にUnixSocketの権限を自動的に設定する方法は? システムの再起動後にUnixSocketの権限を自動的に設定する方法は? Mar 31, 2025 pm 11:54 PM

システムが再起動した後、UnixSocketの権限を自動的に設定する方法。システムが再起動するたびに、UnixSocketの許可を変更するために次のコマンドを実行する必要があります:sudo ...

php8 と php7 ではどちらが優れていますか? php8 と php7 ではどちらが優れていますか? Nov 16, 2023 pm 03:09 PM

PHP7 と比較すると、PHP8 にはパフォーマンス、新機能と構文の改善、型システム、エラー処理と拡張機能の点でいくつかの利点と改善点があります。ただし、どのバージョンを使用するかは、特定のニーズとプロジェクトの状況によって異なります。詳細な紹介: 1. パフォーマンスの向上、PHP8 はコードの実行速度を向上できるジャストインタイム (JIT) コンパイラーを導入します; 2. 新機能と構文の改善、PHP8 は名前付きパラメーターとオプションのパラメーターの宣言をサポートします。関数の作成 呼び出しがより柔軟になり、匿名クラス、プロパティの型宣言などが導入されています。

Docker環境にPECLを使用して拡張機能をインストールするときにエラーが発生するのはなぜですか?それを解決する方法は? Docker環境にPECLを使用して拡張機能をインストールするときにエラーが発生するのはなぜですか?それを解決する方法は? Apr 01, 2025 pm 03:06 PM

エラーの原因とソリューションPECLを使用してDocker環境に拡張機能をインストールする場合、Docker環境を使用するときに、いくつかの頭痛に遭遇します...

See all articles