PHPの例外
例外とは何ですか?
例外は、PHPスクリプトのエラーまたは予期しない動作を説明するオブジェクトです。
例外は、多くのPHP関数およびクラスによってスローされます。
ユーザー定義の関数とクラスも例外をスローできます。
例外は、関数が使用できないデータに遭遇したときに関数を停止する良い方法です。
例外のスロー
throw
ステートメントを使用すると、ユーザー定義の関数またはメソッドで例外をスローできます。例外がスローされると、その後のコードは実行されません。
例外がキャッチされない場合、「Uncaught Exception」メッセージとともに致命的なエラーが発生します。
キャッチせずに例外をスローしてみましょう。
例
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
echo divide(5, 0);
?>
結果は次のようになります。
<div> <b>Fatal error</b>: <strong>Uncaught Exception</strong>: Division by zero in C:\webfolder\test.php:4
Stack trace: #0 C:\webfolder\test.php(9):
divide(5, 0) #1 {main} thrown in <b>C:\webfolder\test.php</b> on line <b>4</b> </div>
try...catch ステートメント
上記の例のエラーを回避するには、try...catch
ステートメントを使用して例外をキャッチし、プロセスを続行します。
構文
<div> try {
code that can throw exceptions
} catch(Exception $e) {
code that runs when an exception is caught
}</div>
例
例外がスローされたときにメッセージを表示します。
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} catch(Exception $e) {
echo "Unable to divide.";
}
?>
Exception
で、変数名は $e
です。
try...catch...finally ステートメント
try...catch...finally
文は、例外をキャッチするために使うことができる。finally
ブロック内のコードは、例外がキャッチされたかどうかにかかわらず、常に実行される。finally
がある場合、catch
ブロックは省略可能です。
構文
<div> try {
code that can throw exceptions
} catch(Exception $e) {
code that runs when an exception is caught
} finally {
code that always runs regardless of whether an exception was caught
}</div>
例
例外がスローされたときにメッセージを表示し、プロセスが終了したことを示します。
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} catch(Exception $e) {
echo "Unable to divide. ";
} finally {
echo "Process complete.";
}
?>
例
例外がキャッチされなかった場合でも文字列を出力します。
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} finally {
echo "Process complete.";
}
?>
例外オブジェクト
例外オブジェクトには、関数で発生したエラーと予期しない動作に関する情報が含まれています。
構文
<div> new Exception(message, code, previous)</div>
パラメータ値
パラメータ |
説明 |
---|---|
message | オプション。例外がスローされた理由を説明する文字列。 |
code | オプション。この例外を同じタイプの他の例外と簡単に区別するために使用できる整数。 |
previous | オプション。この例外が別の例外のcatchブロックでスローされた場合は、その例外をこのパラメーターに渡すことをお勧めします。 |
メソッド
例外をキャッチするときに、例外に関する情報を取得するために使用できるメソッドの一部を次の表に示します。
方法 |
説明 |
---|---|
getMessage() | 例外がスローされた理由を説明する文字列を返します。 |
getPrevious() | この例外が別の例外によってトリガーされた場合、このメソッドは前の例外を返します。そうでない場合は、戻りますNULL |
getCode() | 例外コードを返します |
getFile() | 例外がスローされたファイルのフルパスを返します。 |
getLine() | 例外をスローしたコード行の行番号を返します。 |
例
スローされた例外に関する情報を出力します。
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero", 1);
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} catch(Exception $ex) {
$code = $ex->getCode();
$message = $ex->getMessage();
$file = $ex->getFile();
$line = $ex->getLine();
echo "Exception thrown in $file on line $line: [Code $code]
$message";
}
?>
完全な例外リファレンス
完全なリファレンスについては、PHP 例外リファレンスを参照して下さい。
リファレンスには、すべての例外メソッドの説明と例が含まれています。
プログラミング学習を加速させる
プログラミングをプロの講師に教えてもらいませんか。