PHP的全局错误处理详解_PHP

May 27, 2016 am 10:18 AM
PHP例外処理

本文目的

PHP的全局错误处理,在开发项目的时候很有用,可以帮助开发者快速定位一些问题,提高工作效率。默认情况下,全局错误会直接输出,但是最近开发时使用的一个框架库对全局错误处理进行了设定,导致很多错误信息没有输出,在定位问题上有一定的耗时。所以,研究了一下此库的实现,发现它设定了error_reporting和set_error_handler,导致此现象。现在记录一下这两个函数的用法,作为备忘录。

背景

PHP没有类型检测,开发人员比较容易输入错误单词,引起致命错误,最终导致脚本停止执行。如果这个时候,没有得到任何错误消息,那么会是一件很痛苦的事情。你不得不从脚本的第一行代码开始调试,在成千上万行的代码中不断的print或者echo,直到定位到这个输错的单词。然后,有不得不原路返回,将先前添加的print或echo全部删除。这时一件及其枯燥乏味的工作。

一般情况

正常情况下,php会将致命错误直接输出,会将错误的出处(文件地址,行号)和原因等输出,这样,开发着可以很方便的定位到问题。

但是有些时候,可能由于php.ini的设置问题,可能是第三方框架配置的问题,导致这些信息没有输出,那么此时,必须学会自己设置相关参数,输出这些错误信息,帮助快速定位问题。

error_reporting

error_reporting是一个php的全局配置参数,在php.ini中。用于配置错误输出级别,参数是比特位,可以用来设置错误输出的级别,下面是从php.ini中copy出来的信息:

; 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会输出所有错误信息,除了notice。同样,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,然后在注册自己的的错误处理函数。这种方式,在生产环境下,尤其重要,因为即时出错,敏感内部错误信息也不会暴露给潜在的恶意用户。还有很重要的一点需要指出,自定义错误处理函数不能处理fatal error(比如编译错误)。下面是一个使用自定义错误处理函数的列子:

<&#63;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 = 'Notice';
      break;
    case E_WARNING:
    case E_USER_WARNING:
      $error_type = 'Warning';
      break;
    case E_ERROR:
    case E_USER_ERROR:
      $error_type = 'Fatal Error';
      $EXIT = TRUE;
      break;
    default:
      $error_type = 'Unknown';
      $EXIT = TRUE;
      break;
  }
  printf ("%s: %s in %s on line %d\n", $error_type, $error_message, $file, $line);
 
  if ($EXIT) {
    die();
  }
}
set_error_handler ('error_handler');
 
//new NonExist();
echo $novar;
echo 3/0;
trigger_error ('Trigger a fatal error', E_USER_ERROR);
new NonExist();
&#63;>
ログイン後にコピー

执行此脚本可以得到下面的输出:

Notice: Undefined variable: novar in /your/php_demo_file.php on line 40

Warning: Division by zero in /your/php_demo_file.php on line 41

Fatal Error: Trigger a fatal error in /your/php_demo_file.php on line 42

ログイン後にコピー

可以看到,最后的“new NoExistClass()”的异常,没有被自定义的错误处理函数捕获。

最后,捎带提一下,set_exception_handler注册顶层的异常处理,在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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

PHP 致命的エラー: キャッチされない例外「例外」の解決策 PHP 致命的エラー: キャッチされない例外「例外」の解決策 Aug 18, 2023 pm 03:28 PM

PHP は、Web サイトに強力で動的な機能を提供する、広く使用されているサーバー側プログラミング言語です。ただし、実際には、開発者はさまざまなエラーや例外に遭遇する可能性があります。一般的なエラーの 1 つは、PHPFatalerror:UncaughtException'Exception' です。この記事では、このエラーの原因とその修正方法について説明します。例外の概念 PHP では、例外とは、プログラムの実行プロセス中に発生する予期しない状況を指します。

PHP 例外処理のヒント: try...catch ブロックを使用して複数の例外をキャッチして処理する方法 PHP 例外処理のヒント: try...catch ブロックを使用して複数の例外をキャッチして処理する方法 Jul 29, 2023 pm 01:05 PM

PHP 例外処理のヒント: try...catch ブロックを使用して複数の例外をキャッチして処理する方法 はじめに: PHP アプリケーション開発において、例外処理は非常に重要な部分です。コード内でエラーまたは例外が発生した場合、適切な例外処理によりプログラムの堅牢性と信頼性が向上します。この記事では、try...catch ブロックを使用して複数の例外をキャプチャして処理する方法を紹介し、開発者がより柔軟で効率的な例外処理を実行できるようにします。例外処理の概要 例外とは、プログラムの実行中に発生するエラーまたは特殊な状況を指します。例外が発生した場合

PHP プログラムでの例外分類のベスト プラクティス PHP プログラムでの例外分類のベスト プラクティス Jun 06, 2023 am 08:01 AM

PHP コードを記述する場合、例外処理はコードの堅牢性と保守性を高めるために不可欠な部分です。ただし、例外処理も注意して使用する必要があります。そうしないと、さらに問題が発生する可能性があります。この記事では、例外処理を有効に活用してコードの品質を向上させるのに役立つ、PHP プログラムでの例外分類のベスト プラクティスをいくつか紹介します。例外の概念 PHP では、例外とは、プログラムの実行中に発生するエラーまたは予期しない状況を指します。通常、例外が発生するとプログラムの実行が停止し、例外メッセージが出力されます。

PHPで例外を効果的に処理する方法(試して、キャッチ、最後に、スロー)? PHPで例外を効果的に処理する方法(試して、キャッチ、最後に、スロー)? Apr 05, 2025 am 12:03 AM

PHPでは、Try、Catch、最後にキーワードをスローすることにより、例外処理が達成されます。 1)TRYブロックは、例外をスローする可能性のあるコードを囲みます。 2)キャッチブロックは例外を処理します。 3)最後にブロックは、コードが常に実行されることを保証します。 4)スローは、例外を手動でスローするために使用されます。これらのメカニズムは、コードの堅牢性と保守性を向上させるのに役立ちます。

PHP 例外およびフォールト トレランス メカニズムを使用する方法は? PHP 例外およびフォールト トレランス メカニズムを使用する方法は? Jun 30, 2023 am 10:13 AM

PHP の例外処理とフォールト トレランス メカニズムを使用するにはどうすればよいですか?はじめに: PHP プログラミングでは、例外処理とフォールト トレランスのメカニズムが非常に重要です。コードの実行中にエラーまたは例外が発生した場合、例外処理を使用してこれらのエラーを捕捉および処理し、プログラムの安定性と信頼性を確保できます。この記事では、PHP の例外処理とフォールト トレランスのメカニズムの使用方法を紹介します。 1. 例外処理の基礎知識: 例外とは何ですか?例外とは、コードの実行中に発生するエラーまたは異常な状態であり、構文エラー、実行時エラー、論理エラーなどが含まれます。違うとき

PHP バックエンド関数開発でグローバル例外処理を実装するにはどうすればよいですか? PHP バックエンド関数開発でグローバル例外処理を実装するにはどうすればよいですか? Aug 05, 2023 pm 03:36 PM

PHP バックエンド関数開発でグローバル例外処理を実装するにはどうすればよいですか? PHP バックエンド開発において、例外処理は非常に重要な部分です。これはプログラム内のエラーを見つけて適切に処理するのに役立ち、それによってシステムの安定性とパフォーマンスが向上します。この記事では、PHP バックエンド関数開発でグローバル例外処理を実装する方法と、対応するコード例を紹介します。 PHP には例外処理メカニズムが用意されており、try および catch キーワードを使用して例外をキャッチし、それに応じて処理できます。グローバル例外処理とは、すべての例外処理を指します。

PHP で API を実装する際のデータ例外とエラー処理戦略を処理する方法 PHP で API を実装する際のデータ例外とエラー処理戦略を処理する方法 Jun 17, 2023 am 08:12 AM

API の使用がますます普及するにつれて、API の開発および使用中にデータの例外とエラーの処理戦略も考慮する必要があります。この記事では、API を実装するときに PHP がこれらの問題をどのように処理するかを説明します。 1. データ異常の処理 データ異常には、ユーザー入力エラー、ネットワーク送信エラー、内部サーバーエラーなど、さまざまな理由が考えられます。 PHP で開発する場合、次のメソッドを使用してデータ例外を処理できます。適切な HTTP ステータス コードを返します。HTTP プロトコルでは、役立つ多くのステータス コードが定義されています。

PHP 時間処理例外: エラーを返す時間 PHP 時間処理例外: エラーを返す時間 Mar 28, 2024 pm 01:51 PM

PHP 時間処理例外: 時間を返す際のエラー。特定のコード例が必要です。Web 開発では、時間処理は非常に一般的な要件です。一般的に使用されるサーバー側スクリプト言語として、PHP は豊富な時間処理関数とメソッドを提供します。ただし、実際のアプリケーションでは、コード内のエラーや不適切な使用が原因で、戻り時間が間違っているという異常な状況に遭遇することがあります。この記事では、戻り時間エラーを引き起こす可能性のあるいくつかの一般的な状況を紹介し、読者の理解を深めるためにいくつかの具体的なコード例を示します。

See all articles