ホームページ  >  記事  >  php教程  >  例外処理、エラースロー、コールバック関数などの PHP のオブジェクト指向エラー処理メソッド

例外処理、エラースロー、コールバック関数などの PHP のオブジェクト指向エラー処理メソッド

WBOY
WBOYオリジナル
2016-06-13 11:56:311003ブラウズ

例外処理は、指定されたエラー (例外) 条件が発生したときにスクリプトの通常のフローを変更するために使用されます。この状況を例外といいます。
PHP 5 には、他の言語と同様の例外処理モジュールが追加されています。 PHP コードで生成された例外は、throw ステートメントでスローし、catch ステートメントでキャッチできます。例外処理が必要なコードは、発生する可能性のある例外をキャッチするために try コード ブロックに配置する必要があります。すべてのトライには少なくとも 1 つの対応するキャッチが必要です。複数のキャッチを使用して、さまざまなクラスによって生成された例外をキャッチします。 try ブロックが例外をスローしなくなった場合、またはスローされた例外に一致する catch が見つからなかった場合、PHP コードは最後の catch にジャンプした後、実行を継続します。もちろん、PHP では、catch ブロック内で例外を再度スローすることができます。

例外がスローされると、後続のコード (翻訳者注: 例外がスローされたときのコード ブロックを指します) は実行を続行せず、PHP は一致する最初のコードを見つけようとします。キャッチ。例外がキャッチされず、set_Exception_handler() を使用して適切に処理されなかった場合、PHP は重大なエラーを生成し、Uncaught Exception... (キャッチされなかった例外) メッセージを出力します。

例外がトリガーされると、一般的に何が起こります:
• 現在のコードの状態が保存されます
• コードの実行が事前定義された例外ハンドラー関数に切り替わります
•状況に応じて、プロセッサは保存されたコード状態からコード実行を再開するか、スクリプト実行を終了するか、コード

1 のエラーおよび例外レベル定数テーブル エラー: コンパイル中に見つからない実行時エラー。割り当てられていない変数を出力するには、多くの場合、プログラムまたはロジックを続行できず、中断する必要があります。 🎜>例外: プログラムの実行 プロセス中に予期せぬ状況が発生します。これは論理的には可能ですが、アプリケーションのシナリオを満たさないため、例外は主に、所定の形式ではない長さのユーザー名を受信した場合に発生します。コーダーが事前判断を行って例外をスローするようにするため、例外をキャッチした後、プログラムを中断せずにこれらの状況を処理できるようにプログラム フローを変更します。
PHP の例外とエラーの定義は、特に古いバージョンの PHP ではあまり明確ではないようです。
エラーとログの値 定数 説明 備考
1 E_ERROR (整数)
致命的な実行時エラー。このタイプのエラーは、メモリ割り当てによって引き起こされる問題など、通常は回復不可能な状況です。その結果、スクリプトは終了し、実行が続行されなくなります。
2 E_WARNING (整数)
実行時警告 (致命的ではないエラー)。プロンプト メッセージのみが表示されますが、スクリプトは終了しません。
4 E_PARSE (整数)
コンパイル時の構文解析エラー。解析エラーはパーサーによってのみ生成されます。
8 E_NOTICE (整数)
実行時通知。スクリプトでエラーとして表示される可能性のある状況が発生したことを示しますが、正常に実行できるスクリプトにも同様の通知が表示される可能性があります。
16 E_CORE_ERROR(integer)
PHP の初期化起動中に致命的なエラーが発生しました。このエラーは E_ERROR に似ていますが、PHP エンジン コアによって生成されます。 PHP 4 以降
32 E_CORE_WARNING(integer)
PHP の初期化起動中に発生した警告 (致命的ではないエラー)。 E_WARNING に似ていますが、PHP エンジン コアによって生成されます。 PHP 4 以降
64 E_COMPILE_ERROR(integer)
致命的なコンパイル時エラー。 E_ERROR に似ていますが、Zend スクリプト エンジンによって生成されます。 PHP 4 以降
128 E_COMPILE_WARNING(integer)
コンパイル時間の警告 (致命的ではないエラー)。 E_WARNING に似ていますが、Zend スクリプト エンジンによって生成されます。 PHP 4 以降
256 E_USER_ERROR(integer)
ユーザーが生成したエラー メッセージ。 E_ERROR に似ていますが、ユーザーがコード内で PHP 関数trigger_error()を使用して生成されます。 PHP 4 以降
512 E_USER_WARNING(integer)
ユーザーによって生成された警告メッセージ。 E_WARNING に似ていますが、コード内で PHP 関数trigger_error()を使用してユーザーによって生成されます。 PHP 4 以降
1024 E_USER_NOTICE(integer)
ユーザーによって生成された通知情報。 E_NOTICE に似ていますが、コード内で PHP 関数trigger_error()を使用してユーザーによって生成されます。 PHP 4 以降
2048 E_STRICT (整数)
コードの最高の相互運用性と上位互換性を確保するために、コード変更に対する PHP の提案を有効にします。 PHP 5 以降
4096 E_RECOVERABLE_ERROR(integer)
キャッチできる致命的なエラー。 これは、潜在的に危険なエラーが発生したが、PHP エンジンが不安定になる原因ではなかったことを示します。 エラーがユーザー定義のハンドラー (set_error_handler() を参照) によって捕捉されない場合、E_ERROR となり、スクリプトは終了します。 PHP 5.2.0 以降
8192 E_DEPRECATED(integer)
実行時通知。有効にすると、将来のバージョンで正しく動作しなくなる可能性があるコードについて警告が表示されます。 PHP 5.3.0 以降
16384 E_USER_DEPRECATED(integer)
ユーザーが生成した警告メッセージ。 E_DEPRECATED と似ていますが、コード内で PHP 関数trigger_error()を使用してユーザーによって生成されます。 PHP 5.3.0 以降
30719 E_ALL (整数)
E_STRICT すべてのエラーおよび警告メッセージ。PHP 5.3.x では 30719、PHP 5.2.x では 6143、以前は 2047

2. error_reporting() および try-catch、throw
error_reporting() 関数を取得できます (パラメーターを渡すとき)、スクリプトが処理する例外を設定します (すべての例外を処理する必要があるわけではありません。たとえば、E_CORE_WARNING、E_NOTICE、および E_DEPRECATED は無視できます)。この設定は、php の error_reporting オプションで定義された例外処理設定をオーバーライドします。 .ini。
例:
error_reporting(E_ALL&~E_NOTICE); // E_NOTICE を除いて、他の例外がトリガーされます (E_ALL&~E_NOTICE の二項演算の結果は、E_NOTICE の対応するビットの値が 0 に設定されます) ) try-catch はクラス内で使用できません。自動ロード関数 __autoload() が有効になります。
try-catch は、trigger_error() によって引き起こされるエラーなどの例外やエラーをキャッチするために使用することはできません。

コードをコピー コードは次のとおりです:


try{
// エラーが発生する可能性のあるコードです
} catch(Exception $err){ // このエラー オブジェクトは、システムのデフォルトの例外処理クラスです。
echo $err->getMessage();

/ /thrown は、次のような例外をスローできます。
thrown new Exception('an error')
例:
try {
if ( empty( $var1 ); ) throw new NotEmptyException() ;
if ( empty( $var2 ) ) throw new NotEmptyException();
if ( ! preg_match() ) throw new InvalidInputException(); );
$ template->render( 'success' );
} catch ( NotEmptyException $e ) {
$template->render( 'error_empty' ); $e ) {
$template->render( 'error_preg' );
}
[/code]
Exception クラスの構造: ほとんどのメソッドはオーバーライドできません (最終)



コードをコピー

コードは次のとおりです: Exception {

/* 属性*/

protected string $message;
protected int $code ;
protected int $line ;
/* メソッド*/
public __construct ([ string $message = " [, int $code = 0 [, Exception $previous = null]]] )
final public string getMessage ( void ) //例外によってスローされたメッセージ
final public Exception getPrevious ( void ) //前の例外
final public int getCode ( void ) / /例外コード、これはユーザー定義です
final public string getFile (void) //例外が発生したファイルパス
final public int getLine (void) //例外が発生した行
final public array getTrace (void) //例外追跡情報 (array)
final public string getTraceAsString (void) //例外追跡情報 (string)
public string __toString (void) //例外オブジェクトを直接文字列として扱おうとする
final private void __clone (void) //例外オブジェクトの複製時に呼び出す
}



拡張例外クラス

try-catch には複数の catch 句を含めることができます。最初の catch 句から始めて、句内の例外変数の型が throw ステートメントによってスローされる例外の型と一致する場合、句は次のようになります。例外はすべての例外クラスの基本クラスであるため、異なる例外に応じて異なる処理メソッドを使用すると、例外はそれに一致します。タイプの場合は、例外タイプを使用する必要があります。 catch 句は最後に置きます。
例外はすべての例外の基本クラスです。実際のニーズに応じて例外クラスを拡張できます。

コードは次のとおりです。 🎜>

calss MyException extends Exception{ public errType = 'default'; public function __construct($errType=''){ $this->errType = $errType; }

}

thrown new MyException (); // 例外をスローします
try{
// エラーを引き起こす可能性のあるコードを作成しました
}catch(MyException $err){ // このエラー オブジェクトには宣言された型が必要です
echo $err->errType();
}catch(ErrorException $err){ //ErrorException は PHP 5 で追加された例外クラスであり、Exception
から継承されます。 echo 'error !';
}catch(Exception $err){
redirect('/error.php')
}


例外の種類を決定できます。 catch 句内で、またはコードやその他の情報に基づいて例外を処理するかどうかを決定します。 catch 句をアンロードしたコードがキャッチされた例外を適切に処理できない場合は、catch 句内で例外をスローし続けることができます。


3. 例外例外コールバック関数



コードをコピー
コードは次のとおりです。


set_Exception_handler(callback functionName) // この関数は、Exception またはそのサブクラスの例外が発生したときに呼び出されます
functionExceptionHandlerFun($errObj){ // Exception 例外のコールバック関数にはパラメータが 1 つだけあります。これは例外オブジェクトがスローされます。
//.....
}


例外例外コールバック関数は、例外発生後のコールバック関数が処理されると、後続のコードは実行されなくなるため、後続のコードの実行を継続したい場合は、try-catch を使用する必要があります。
ただし、例外があります。スクリプト終了コールバック関数は実行でき、スローされた例外が処理されない場合でもコールバック関数は実行できます。
register_shutdown_function(callback functionName[,argument1,argument2,...]);
例:

コードをコピー コードは次のとおりです。 :


function shutdownfunction(){
echo 'スクリプトは終了';

register_shutdown_function("shutdownfunction");スクリプト内の () は最後に実行されるため、このコールバック関数は、エラーがスローされた後に関数が定義されている場合でも、スクリプト内の任意の場所で関数を呼び出すことができます (関数の定義はスクリプトのコンパイル中に完了します)。


4.trigger_error(string errorMsg[,int user_error_type])
この関数はエラーをアクティブにトリガーするために使用されます: user_error_type は E_ALL、E_USER_ERROR、E_USER_WARNING、E_USER_NOTICE またはそれらの値の組み合わせ。 set_error_handler(callbeck functionName[,user_error_type]); // システムによってスローされたエラーや、trigger_error() 関数を使用してユーザーによってトリガーされたエラーなどのエラーを処理するために、trigger_error() のコールバック関数を設定します。
オプションのパラメータ user_error_type:
このパラメータが設定されている場合、trigger_error によってスローされたエラー タイプが user_error_type の定義範囲と一致する場合にのみ、コールバック関数をトリガーできます。
この値の設定は、error_reporting() 関数と似ています。
最初のパラメータ (callbeck functionName):
関数名。関数には 5 つのパラメータを含めることができ、そのうちの最初の 2 つは必須です。
user_error_type throws bytrigger_error、trigger_error throws errorMsg、絶対パラメータエラーがスローされたファイルのパス、エラーがスローされた行番号、およびエラーがスローされたときのコンテキスト (trigger_error() が配置されているスコープ内のすべての変数、関数、クラス、およびその他のデータを含む配列)
コールバック関数の戻り値: false が返された場合、システム エラー処理メカニズムは引き続きエラーをスローするか、戻り値を返さないとエラーが解消されます。
trigger_error() によってトリガーされたエラーは、try-catch 例外キャッチ ステートメントではキャッチされません。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。