PHPでのグローバルエラー処理の詳しい説明

怪我咯
リリース: 2023-03-13 07:22:01
オリジナル
1405 人が閲覧しました

php には独自の try{throw{}}catch{} 例外/エラー キャプチャ システムがあり、実稼働環境で使用するのは困難です。通常、例外/エラーが発生すると、php はすぐに処理を終了する必要があります。スクリプトを作成し、訪問者のブラウザに出力します エラー プロンプトを表示し、カスタム関数

を介して管理者にメッセージを送信しますこの記事の目的

PHP のグローバル エラー処理は、プロジェクトの開発時に非常に役立ち、開発者を支援します問題をすぐに特定し、作業効率を向上させます。デフォルトではグローバルエラーが直接出力されますが、最近開発時に使用したフレームワークライブラリでグローバルエラー処理が設定されているため、出力されないエラーメッセージが多くなり、問題点の特定に時間がかかります。そこで、このライブラリの実装を調べたところ、error_reportingset_error_handlerを設定していることがこの現象を引き起こしていることが分かりました。この2つの機能の使い方をメモとして記録しておきます。

Background

PHP には型検出がありません。開発者が間違った単語を入力しやすく、致命的なエラーが発生し、最終的にはスクリプトの実行が停止します。この時にエラーメッセージが出ないと非常に辛いことになります。スクリプトのコードの最初の行からデバッグを開始し、スペルミスの単語が見つかるまでコードの数千行を印刷またはエコーし続ける必要があります。次に、戻って、以前に追加したプリントまたはエコーをすべて削除する必要があります。これは非常に退屈な仕事です。

一般的な状況

通常の状況では、PHP は致命的なエラーを直接出力し、エラーの原因 (ファイル アドレス、行番号) と理由を出力します。これにより、開発者は問題を簡単に特定できます。

ただし、php.ini 設定の問題やサードパーティのフレームワーク構成の問題により、この情報が出力されない場合があります。このとき、問題を迅速に特定できるように、関連するパラメーターを自分で設定し、これらのエラー メッセージを出力する方法を学ぶ必要があります。 。

error_reporting

error_reporting は、php.ini の php グローバル構成パラメーターです。エラー出力レベルを設定するために使用されるパラメータは、php.ini からコピーされた情報です。デフォルトでは、php はすべてを出力します。エラー情報、通知を除く。同様に、PHP 標準関数では、同じ名前の関数 error_reporting(int $level) が提供されており、これは PHP スクリプトで同じ関数を完了するために使用されます。これは他のプログラムには影響しません。 $level が 0 の場合、エラー出力はオフになり、エラーは出力されないことに注意してください。


set_error_handler

phpのデフォルトのエラー処理は、メッセージを出力することです。ただし、他の操作を定義する必要がある場合もあります。その場合は、エラー処理関数をカスタマイズする必要があります。 PHP には、独自のエラー処理関数の登録に役立つ組み込み関数 set_error_handler が用意されています。関数のプロトタイプは次のとおりです:

mixed set_error_handler ( callback $error_handler [, int $error_types = E_ALL | E_STRICT ] )

エラー処理関数が登録されている場合でも、デフォルトの動作が引き続き実行されることに注意してください。つまり、エラーが発生してもエラー メッセージが出力されるため、プログラム内で明示的にエラー レベルを 0 に設定し、独自のエラー処理関数を登録する必要があります。このアプローチは、実稼働環境では特に重要です。これは、何か問題が発生した場合でも、機密の内部エラー情報が潜在的に悪意のあるユーザーに公開されることがないためです。カスタム エラー処理関数は致命的なエラー (コンパイル エラーなど) を処理できないことを指摘することも重要です。以下はカスタム エラー処理関数の使用例です:

; error_reporting is a bit-field. Or each number up to get desired error
; reporting level
; E_ALL - All errors and warnings (doesn't include E_STRICT)
; E_ERROR - fatal run-time errors
; E_RECOVERABLE_ERROR - almost fatal run-time errors
; E_WARNING - run-time warnings (non-fatal errors)
; E_PARSE - compile-time parse errors
; E_NOTICE - run-time notices (these are warnings which often result
; from a bug in your code, but it's possible that it was
; intentional (e.g., using an uninitialized variable and
; relying on the fact it's automatically initialized to an
; empty string)
; E_STRICT - run-time notices, enable to have PHP suggest changes
; to your code which will ensure the best interoperability
; and forward compatibility of your code
; E_CORE_ERROR - fatal errors that occur during PHP's initial startup
; E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's
; initial startup
; E_COMPILE_ERROR - fatal compile-time errors
; E_COMPILE_WARNING - compile-time warnings (non-fatal errors)
; E_USER_ERROR - user-generated error message
; E_USER_WARNING - user-generated warning message
; E_USER_NOTICE - user-generated notice message
;
; Examples:
;
; - Show all errors, except for notices and coding standards warnings
;
;error_reporting = E_ALL & ~E_NOTICE
;
; - Show all errors, except for notices
;
;error_reporting = E_ALL & ~E_NOTICE | E_STRICT
;
; - Show only errors
;
;error_reporting = E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR
;
; - Show all errors except for notices and coding standards warnings
;
error_reporting = E_ALL & ~E_NOTICE
ログイン後にコピー

このスクリプトを実行して次の出力を取得します:

<?php
error_reporting (0);
function error_handler ($error_level, $error_message, $file, $line) {
  $EXIT = FALSE;
  switch ($error_level) {
    case E_NOTICE:
    case E_USER_NOTICE:
      $error_type = &#39;Notice&#39;;
      break;
    case E_WARNING:
    case E_USER_WARNING:
      $error_type = &#39;Warning&#39;;
      break;
    case E_ERROR:
    case E_USER_ERROR:
      $error_type = &#39;Fatal Error&#39;;
      $EXIT = TRUE;
      break;
    default:
      $error_type = &#39;Unknown&#39;;
      $EXIT = TRUE;
      break;
  }
  printf ("%s: %s in %s on line %d\n", $error_type, $error_message, $file, $line);
 
  if ($EXIT) {
    die();
  }
}
set_error_handler (&#39;error_handler&#39;);
 
//new NonExist();
echo $novar;
echo 3/0;
trigger_error (&#39;Trigger a fatal error&#39;, E_USER_ERROR);
new NonExist();
?>
ログイン後にコピー

ご覧のとおり、最後の "new NoExistClass()" 例外にはカスタマイズされたエラー処理関数がありません。捕獲。

最後に、

set_Exception_handler

は、Web アプリケーションでトップレベルの例外処理を登録し、それを設定して、一律にエラー処理ページにジャンプすることができます。

以上がPHPでのグローバルエラー処理の詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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