ホームページ > バックエンド開発 > PHPチュートリアル > PHP のエラー処理および例外処理メカニズムを解決する方法

PHP のエラー処理および例外処理メカニズムを解決する方法

零到壹度
リリース: 2023-03-23 14:16:01
オリジナル
4923 人が閲覧しました

この記事では、PHP のエラー処理と例外処理メカニズムを解決する方法を説明します。必要な方は参考にしてください。PHP プログラムを作成する場合、エラー処理は重要な部分です。プログラムにエラー検出コードが不足している場合、非常にプロフェッショナルに見えず、セキュリティ リスクへの扉が開かれます

例:

<?php
    $a = fopen(&#39;test.txt&#39;,&#39;r&#39;);
    //这里并没有对文件进行判断就打开了,如果文件不存在就会报错
?>
ログイン後にコピー

その場合、正しい記述は次のようになります:

<?php
    if (file_exists(&#39;test.txt&#39;)) {
        $f = fopen(&#39;test.txt&#39;, &#39;r&#39;);
        // 使用完后关闭
        fclose($f);
    }
?>
ログイン後にコピー

1. 3 つの方法PHP エラー処理の A. 単純な die() ステートメントは、exit() と同等です。 1. エラー ハンドラー (通常、構文エラーの処理に使用されます)

カスタム エラー関数を作成します。 (ハンドラー)。関数は少なくとも 2 つのパラメーター (error_level と errormessage) を処理できる必要がありますが、最大 5 つのパラメーター (error_file、error_line、error_context) を受け入れることができます構文:

if (!file_exists(&#39;aa.txt&#39;)) {
    die(&#39;文件不存在&#39;);
} else {
    // 执行操作
}
// 如果上面die()被触发,那么这里echo接不被执行
echo &#39;ok&#39;;
ログイン後にコピー

エラー報告レベル (理解してください)

これらのエラー報告レベルは、エラー ハンドラーが処理するように設計されているさまざまなタイプのエラーです:

file_exits(&#39;aaa.txt&#39;) or die(&#39;文件不存在&#39;);
echo &#39;ok&#39;;
ログイン後にコピー

2. エラー トリガー (通常、論理エラーを処理するために使用されます)

要件: たとえば、年齢を受け取りたい場合、数値が 120 より大きい場合、エラーとみなされます従来の方法:

function error_function($error_level, $error_message, $error_file, $error_line, $error_context)
// 创建好后还需要改写set_error_handler();函数
set_error_handler(&#39;error_function&#39;, E_WARNING); // 这里error_function对应上面创建的自定义处理器名,第二个参数为使用自定义错误处理器的错误级别;
ログイン後にコピー

トリガーの使用:

值        常量                                  描述
2    E_WARNING    非致命的 run-time 错误。不暂停脚本执行。    
8    E_NOTICE    Run-time 通知。脚本发现可能有错误发生,但也可能在脚本正常运行时发生。    
256    E_USER_ERROR    致命的用户生成的错误。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR。    
512    E_USER_WARNING    非致命的用户生成的警告。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING。    
1024    E_USER_NOTICE    用户生成的通知。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE。    
4096    E_RECOVERABLE_ERROR    可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。(参见 set_error_handler())    
8191    E_ALL    所有错误和警告,除级别 E_STRICT 以外。(在 PHP 6.0,E_STRICT 是 E_ALL 的一部分)
ログイン後にコピー

演習問題:

<?php
if ($age > 120) {
    echo &#39;年龄错误&#39;;
    exit();
}
?>
ログイン後にコピー

C. エラーログ

デフォルトでは、php の error_log 設定に従っています。 .ini、PHP はエラー レコードをサーバーのエラー記録システムまたはファイルに送信します。エラー レコードは、error_log() 関数を使用してファイルまたはリモートの宛先に送信できます。 構文:

<?php
if ($age > 120) {
    // trigger_error(&#39;错误信息&#39;[,&#39;错误等级&#39;]); 这里错误等级为可选项,用于定义该错误的级别
    // 用户定义的级别包含以下三种:E_USER_WARNING 、E_USER_ERROR 、E_USER_NOTICE
    trigger_error(&#39;年龄错误&#39;); // 这里是调用的系统默认的错误处理方式,我们也可以用自定义处理器
}
 
/**
 * 自定义处理器,与上面相同
 */
function myerror($error_level, $error_message) {
    echo &#39;error text&#39;;
}
 
//  同时需要改变系统默认的处理函数
set_error_handler(&#39;myerror&#39;, E_USER_WARNING); // 同上面,第一个参数为自定义函数的名称,第二个为错误级别【这里的错误级别通常为以下三种:E_USER_WARNING 、E_USER_ERROR 、E_USER_NOTICE】
// 现在再使用trigger_error就可以使用自定义的错误处理函数了
?>
ログイン後にコピー

タイプ部分は通常 3 で、元のコンテンツの宛先を上書きせずにファイルの後にエラー情報を追加することを意味します。それは、保存されたファイルまたはリモート宛先です

など: error_log("$error_info",3,"errors.txt");

2. PHP 例外処理 [重要なポイント]

1. 基本的な構文

<?php
date_default_timezone_set(&#39;PRC&#39;);
function myerror($error_level, $error_message) {
    $info = "错误号:$error_level";
    $info .= "错误信息:$error_message";
    $info .= &#39;发生时间:&#39; . date(&#39;Y-m-d H:i:s&#39;);
    $filename = &#39;aa.txt&#39;;
    if (!$fp = fopen($filename, &#39;a&#39;)) {
        echo &#39;创建文件&#39; . $filename . &#39;失败&#39;;
    }
    if (is_writeable($filename)) {
        if (!fwrite($fp, $info)) {
            echo &#39;写入文件失败&#39;;
        } else {
            echo &#39;已成功记录错误信息&#39;;
        }
        fclose($fp);
    } else {
        echo &#39;文件&#39; . $filename . &#39;不可写&#39;;
    }
    exit();
}
 
set_error_handler(&#39;myerror&#39;, E_WARNING);
$fp = fopen(&#39;aaa.txt&#39;, &#39;r&#39;);
?>
ログイン後にコピー

2.処理 プログラムには以下を含める必要があります:

try - 例外を使用する関数は、「try」コード ブロック内に配置する必要があります。例外がトリガーされない場合、コードは通常どおり実行を続行します。ただし、例外がトリガーされると、例外がスローされます。 throw - 例外をトリガーする方法を指定します。各「スロー」は少なくとも 1 つの「キャッチ」に対応する必要があります。 - 「キャッチ」コード ブロックは例外をキャッチし、例外情報を含むオブジェクトを作成します。

<

error_log(error[, type, destination, headers])
ログイン後にコピー

上記のコードは次のようなエラーを受け取ります:

メッセージ: 値は 1 以下である必要があります

説明例:

上記のコードは例外をスローし、それをキャッチします:

checkNum() 関数を作成します。数値が 1 より大きいかどうかを確認し、1 より大きい場合は例外をスローします。

「try」コードブロックでcheckNum()関数を呼び出します。

checkNum()関数で例外がスローされます。

「catch」コード ブロックは例外を受け取り、例外情報を含むオブジェクト ($e) を作成します。

この例外オブジェクトから $e->getMessage() を呼び出して、この例外からのエラー メッセージを出力します。

ただし、「各スローはキャッチに対応する必要がある」という原則に従うために、見逃したエラーを処理する最上位の例外ハンドラーをセットアップできます。

set_Exception_handler() 関数は、キャッチされなかった例外をすべて処理するユーザー定義関数を設定できます。

<?php
try {
    // 可能出现错误或异常的代码
    //catch 捕获  Exception是PHP已定义好的异常类
} catch (Exception $e) {
    // 对异常处理,方法:
    //1、自己处理
    //2、不处理,可以再次抛出 throw new Exception(&#39;xxx&#39;);
}
?>
ログイン後にコピー

カスタム例外クラスを作成する

?php
/**
 * 创建可抛出一个异常的函数
 */
function checkNum($number) {
    if ($number > 1) {
        throw new Exception("Value must be 1 or below");
    }
 
    return true;
}
 
// 在 "try" 代码块中触发异常
try {
    checkNum(2);
    // 如果异常被抛出,那么下面一行代码将不会被输出
    echo &#39;If you see this, the number is 1 or below&#39;;
} catch (Exception $e) {
    // 捕获异常
    echo &#39;Message: &#39; . $e->getMessage();
}
?>
ログイン後にコピー

複数の catch を使用して、さまざまな状況でエラー メッセージを返すことができます

<?php
/**
 * 设置一个顶级异常处理器
 */
function myexception($e) {
    echo &#39;this is top exception&#39;;
}
 
// 修改默认的异常处理器
set_exception_handler("myexception");
try {
    $i = 5;
    if ($i < 10) {
        throw new Exception(&#39;$i must greater than 10&#39;);
    }
} catch (Exception $e) {
    // 处理异常
    echo $e->getMessage() . &#39;<br/>&#39;;
 
    // 不处理异常,继续抛出
    throw new Exception(&#39;errorinfo&#39;); // 也可以用throw $e 保留原错误信息;
}
?>
ログイン後にコピー

例外ルール

潜在的な異常のキャプチャを容易にするために、例外処理を必要とするコードは try コード ブロックに配置する必要があります。

各 try または throw コード ブロックには、対応する catch コード ブロックが少なくとも 1 つ必要です。

複数の catch ブロックを使用して、さまざまな種類の例外をキャッチします。

例外は、try コード内の catch コード ブロックで再スローできます。

要するに: 例外がスローされた場合は、それをキャッチする必要があります。

以上がPHP のエラー処理および例外処理メカニズムを解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート