-まだ例外に精通していない人
-例外のより合理的な使用を見つけようとしている人
この記事では、例外の非常に基本的なこと、例外を使用しない方法、および言語の機能の一部の正しい使用方法について説明します...
プログラミング言語の進化は、開発者の世界観に劇的な変化をもたらすことがあります。 PHPの世界では、これは5番目のブランチの出現により発生しました。これにより、新しいオブジェクトモデル、組み込み関数の新しいセット、および新しいエラー処理メソッドがもたらされました。
PHP(以下、5番目のバージョンを意味します)に精通し始めた人は、別の手続き型プログラミング言語に続いて、4kから5kで何が起こっているのか理解せず、同じレベルの使い慣れた関数でコードを処理し続けました相互の関係、および各アクションが正常な戻りコードについてチェックされます。 しかし、例外とクラスについて知っている人は...
理論
例外-コードの実行中に異常な(例外的な)状況の発生についてプログラムからインタープリターに送信されるシグナル。
PHPでは、例外の処理は他のすべての原則と同じ原則に基づいています。 例外をスローするには、throw演算子を使用します。この演算子には例外オブジェクトが渡され、コンストラクターで2つのオプションのパラメーター(例外メッセージと例外コード)を受け取ります。
throw new Exception(\\\"This is exception message\\\", $exception_code);
例外をキャッチするには、try ... catchコンストラクトが使用されます。 tryブロックは、例外につながる可能性のある操作を実行します。catchブロックを使用すると、例外がスローされた場合の処理を決定できます。
try {
throw new Exception(\\\"Exception message\\\");
echo \\\"That code will never been executed\\\";
} catch (Exception $e) {
echo $e->getMessage(); // \\\"Exception message\\\"
}
例からわかるように、例外をスローすると、tryブロックの残りのコードは実行されず、制御はcatchステートメントに転送されます。ここで、スローされた例外が渡されるオブジェクトの呼び出し先を示します(この例では$ e) 。 catchステートメントのブロック内で、例外からのデータに基づいて、状況に応じて何らかのアクションを適用できます。 ここで、例外によって渡されたメッセージを出力しました。
(ちなみに継承できる)Exceptionオブジェクトには、次の最終メソッドのセットがあります。
final function getMessage(); //
final function getCode(); //
final function getFile(); //
final function getLine(); //
final function getTrace(); //
final function getTraceAsString(); //
練習する
例外を使用するのはいつ便利ですか? はい、常に関数またはメソッドが誤った状況に陥る可能性があるとき! 例として組み込み関数mysql_connect()およびmysql_select_db()を使用すると、接続が失敗し、データベースがそれに応じて選択されたときに例外がスローされた場合、コードは次のようになります。
try {
mysql_connect($hostname, $username, $password);
mysql_select_db($dbname);
} catch (Exception $e) {
echo $e->getMessage(); // ,
}
結果に応じて、次のことを行います。
*それらはDBMSに正常に参加し、データベースを選択します(catchブロックのコードは実行されません)
* DBMSへの接続に失敗すると、対応するエラーが表示され、セッションがロールアップされます
*データベース選択エラーが発生した場合、ユーザーにこのトラブルについて通知します
次は質問する時です:\\\「ifステートメントを使用できるのに、なぜそんなに複雑なものが必要なのですか?\\\」。
最初の答えは次のとおりです。\\\ "コードが読みやすいため、エラー処理は別のブロックに表示されます\\\"。 ifステートメントを使用した場合、コードは次のようになります。
$connId = mysql_connect($hostname, $username, $password);
if (false == $connId) {
echo \\\" \\\";
}
$flag = mysql_select_db($dbname);
if (false == $flag) {
echo \\\" .\\\";
}
以前のバージョンでは、コードがより理解しやすいように見えることに同意します。 しかし、それだけではありません。 現在、開発者がこれらのエラーを直接処理する必要はありません。例外をスローするだけで十分であり、より高いレベルで処理できます。 また、例外をチェーンに渡すことができます。
class MyException extends Exception {}
try {
try {
//...
throw new Exception(\\\"inner\\\");
//...
} catch (Exception $e) {
throw new MyException(\\\"outer\\\");
}
} catch (MyException $e) {
echo $e->getMessage(); // \\\"outer\\\"
}
性能
真実に到達しようとして、彼はさまざまなタイプの機能でいくつかの実験を行いました。
最初のタイプはtrueを返し、if ... elseステートメントによってチェックされました
2番目のタイプはfalseを返し、if ... elseステートメントによってチェックされました
3番目のタイプは単にアクションを実行し、何も返しませんでした。 try ... catchブロックでチェック
4番目のタイプは常に例外をスローし、try ... catchでチェックされました
結果:
True:0.72382092475891
False:0.85190796852112
例外なし:0.72565317153931
例外:14.176206827164
予想どおり、例外のスローはかなり高価な操作ですが、正常に実行するための両方のオプションがテストフラッシュに合格しました。
テストはプリミティブ加算関数で実施されましたが、1kk回の反復で行われました
結論
例外を使用する場合 プログラムのエラーまたは異常な動作が暗示される場合、および結果を処理する決定をより高いレベルにシフトする必要がある場合。
しかし、ifステートメントと関数開発のブールステータスをどうすればよいでしょうか? それらを残す。 しかし、本当に必要な場所だけです。 つまり、論理演算子は、実行のフローを制御するのではなく、計算で結果を使用することを意味します。 つまり、この論理値が以降の計算に役立たない場合、関数の正常終了はすべて、オペレーターがtrueを返すことで通知する必要がなくなります。 そして同時に、エラーが発生した関数完了のすべてのステータスを、falseを返す形式からnew Exception()を投げる形式に変更します。
何を覚えておく必要がありますか? 例外の使用は、すべてのコードがステータス(エラーなし)で実行されることを前提としていますが、エラーが発生した場合、catchブロックにはそれを処理する場所が常にあります。