PHP エラーと例外の概要
エラー
エラーレベル
致命的なエラー: 致命的なエラー(スクリプトの実行が終了します)
E_ERROR 致命的なランタイム致命的なエラー、プログラムの実行を終了します
E_CORE_ERROR 起動時のPHP致命的なエラー
E_COMPILE_ERROR PHPコンパイル中の致命的なエラー
E_USER_ERR またはによって生成された致命的なエラーユーザー
解析エラー: コンパイル中の解析エラー (スクリプトは実行を終了します)
解析エラー コンパイル中の構文解析エラー
警告エラー: 警告エラー (プロンプト情報のみが表示されますが、スクリプトは実行を終了しません。)
E_WARNING 実行時警告 (致命的ではないエラー)。
E_CORE_WARNING PHP の初期化起動時に発生する警告 (致命的ではないエラー)。
E_COMPILE_WARNING コンパイル警告
E_USER_WARNING ユーザー生成の警告情報
Notice Error: 通知エラー (通知情報のみが提供されますが、スクリプトは実行を終了しません。)
E_NOTICE 実行時通知。スクリプトがエラーとして表示される可能性のある状況に遭遇したことを示します。
E_USER_NOTICE ユーザーによって生成された通知情報。
set_error_handler() はエラーをキャプチャします [制限付き]
関数の説明
set_error_handler($callback);//スクリプト内で発生したエラーを処理するためのユーザー関数 (error_handler) を設定します。
関数の制限
次のレベルのエラーは、ユーザー定義関数では処理できません: E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING、および set_error_handler() 関数が呼び出されるファイルで生成されるほとんどの E_STRICT。
つまり: set_error_handler($callback) は、システムによって生成された一部の警告および通知レベルのエラーのみをキャプチャできます。
使用法
<?phpset_error_handler("error_handler");function error_handler($errno,$errstr,$errfile,$errline){ $str=<<<EOF "errno":$errno "errstr":$errstr "errfile":$errfile "errline":$errlineEOF; //获取到错误可以自己处理,比如记Log、报警等等 echo $str; }echo $test;//$test未定义,会报一个notice级别的错误
出力結果:
"errno":8"errstr":Undefined variable: test"errfile":/Users/shuchao/Desktop/handler.php"errline":13 如何捕获PHP的Fatal Error、Parse Error等
要件の説明
PHP の致命的なエラーを取得し、ログに記録するなど、オンラインの問題の分析やオンライン サービスの監視に役立ちます。
2つの関数
register_shutdown_function()
register_shutdown_function($callback)
register_shutdown_function()、登録したい関数を[キューのふり]に入れ、スクリプトが正常に終了するか終了コールが表示されるまで待ちます
register_shutdown_function() が呼び出される場合は、次の 3 つの状況があります。
スクリプトがエラーで終了した場合 (解析時ではなく実行時)。
ユーザー exit メソッドを呼び出して終了する場合。 error_get_last()error_get_last();//関数は発生した最後のエラーを取得します。この関数は、最後に発生したエラーを配列の形式で返します。
[message] - エラー メッセージ
[file] - エラーが発生したファイル[line] - エラーが発生した行
メソッド
<?php register_shutdown_function( "fatal_handler" ); define('E_FATAL', E_ERROR | E_USER_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_RECOVERABLE_ERROR| E_PARSE );function fatal_handler() { if( $error = error_get_last()) { $errno = $error["type"]; $errfile = $error["file"]; $errline = $error["line"]; $errstr = $error["message"]; $str=<<<EOF "errno":$errno "errstr":$errstr "errfile":$errfile "errline":$errlineEOF; //获取到错误可以自己处理,比如记Log、报警等等 echo $str; } }
<?phpregister_shutdown_function("error_handler");function error_handler(){ echo "Yeah,it's worked!"; }function test(){}function test(){}
原因分析
<?phpregister_shutdown_function("error_handler");function error_handler(){ echo "Yeah,it's worked!"; }if(true){ function test(){} }function test(){}
Fatal error: Cannot redeclare test() (previously declared in /Users/shuchao/Desktop/error_handler.php:9) in /Users/shuchao/Desktop/error_handler.php on line 7Yeah,it's worked!%
我们看到,上面回调了register_shutdown_function().
因为我们加了一个if()判断,if()里面的test()方法,相当于一个闭包,与外面的test()名称不冲突。
也就是,上面的代码在parse-time没有出错,而是在run-time的时候出错了,所以我们能够获取到fatal error。
NO.3
error_handler.php
<?phpregister_shutdown_function("error_handler");function error_handler(){ echo "Yeah,it's worked!";} test_error.php <?phpinclude './error_handler.php';function test(){}function test(){}
执行 test_error.php的结果如下
Fatal error: Cannot redeclare test() (previously declared in /Users/shuchao/Desktop/test_error.php:3) in/Users/shuchao/Desktop/test_error.php on line 4
原因分析
当我们在运行test_error.php的时候,因为redeclare了两个test()方法,所以php的语法解析器在parse-time的时候就出错了。 所以不能回调register_shutdown_function()中的方法,不能catch住这个fatal error。
NO.4
error_handler.php <?phpregister_shutdown_function("error_handler");function error_handler(){ echo "Yeah,it's worked!";} test_error.php <?phpfunction test(){}function test(){} include_all.php require './error_handler.php';require './test_error.php';
执行 include_all.php的结果如下
Fatal error: Cannot redeclare test() (previously declared in /Users/shuchao/Desktop/include_all.php:2) in /Users/shuchao/Desktop/include_all.php on line 3Yeah,it's worked!%
结果分析
上面我们捕获了fatal_error.因为在运行include_all.php的时候,include_all.php本身语法并没有出错,也就是在parse-time的时候并没有出错,而是include的文件出错了,也就是在run-time的时候出错了,这个时候是能回调register_shutdown_function()中的函数的。
强烈建议:如果我们要使用register_shutdown_function进行错误捕捉,使用NO.4,最后一种方法,可以确保错误都能捕捉到。
更优美的写法·获取所有错误
set_error_handler()与register_shutdown_function()、error_get_last()的结合使用 <?phpregister_shutdown_function( "fatal_handler" );set_error_handler("error_handler");define('E_FATAL', E_ERROR | E_USER_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_RECOVERABLE_ERROR| E_PARSE );//获取fatal errorfunction fatal_handler() { $error = error_get_last(); if($error && ($error["type"]===($error["type"] & E_FATAL))) { $errno = $error["type"]; $errfile = $error["file"]; $errline = $error["line"]; $errstr = $error["message"]; error_handler($errno,$errstr,$errfile,$errline); }}//获取所有的errorfunction error_handler($errno,$errstr,$errfile,$errline){ $str=<<<EOF "errno":$errno "errstr":$errstr "errfile":$errfile "errline":$errlineEOF;//获取到错误可以自己处理,比如记Log、报警等等 echo $str;} Exception Exception与Error的区别 Exception
当异常抛出的时候,我们是想要去捕获他,并去做处理的。所以异常经常被当做程序的控制流程使用。
Error
Error是不可恢复的,是在开发过程中要去解决的。
使用Exception的例子
我想执行insert语句插入一条数据,可能插入失败(比如ID重复),注意是可能失败,所以这是一个可能的情况,也就是异常情况。我们就可以使用异常来处理这个问题
try { $row->insert(); $inserted = true; } catch (Exception $e) { echo "There was an error inserting the row - ".$e->getMessage(); $inserted = false; }echo "Some more stuff";
如何catch一个未捕获的Exception
场景描述
假设程序中的有些地方直接throw了异常,没有进行catch。我们现在想要不管在程序的任何一个地方throw异常,即便在throw的地方没有被catch,我们也要能catch住,如何做到呢?
一个函数:set_exception_handler()
//设置默认的异常处理程序,用于没有用 try/catch 块来捕获的异常。 在 exception_handler 调用后异常会中止。
set_exception_handler()
使用示例
1、exception_handler.php <?phpset_exception_handler("my_exception");function my_exception($exception){ echo $exception->getMessage();} 2、test_exception.php <?phprequire "./exception_handler.php";throw new Exception("I am Exception");
现在我们运行 test_exception.php,结果如下:
I am Exception //证明我们throw的Exception被捕获了

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。
