PHP 例外処理のサンプル(try…catchとthrow)

phpの例外処理のサンプルです。try...catch構文とthrow文についてです。

目次

サンプル try...catch構文とthrow文
  例外処理を行うサンプル
  独自の例外を作成する
Warningをcatchする

try...catch構文とthrow文

try {
  例外が発生する可能性がある処理

} catch ( 例外のクラス 変数 ) {
   例外発生時の処理

} finally{
 例外ありなしに関わらず実行する処理
}
  • 例外が起こる可能性がある箇所をtryブロックで囲みます。
  • 例外が発生しcatchブロックの引数の例外のクラスの型と同じときにcatchブロックの処理が行われます。
  • 以下はPHPマニュアルの例外(exceptions)のリンクです。
    http://php.net/manual/ja/language.exceptions.php
throw new 例外
  • throwは、任意の場所で例外を投げることができます。
  • 例外は以下である必要があります。
    ・Exceptionクラス
    ・Exceptionクラスのサブクラス

 

例外処理を行うサンプル

<?php
$num1 = 2;
$num2 = 0;

try{
	echo calc1($num1,$num2);

}catch(Exception $e){
	echo $e->getMessage();

}finally{
	echo "処理が終了しました";
}
function calc1($a,$b){
	if( $b == 0 ){
		throw new Exception("エラーです");
	}
	return $a/$b;
}
?>

5行目は、例外が起こる可能性がある関数をtryブロックで囲んでいます。
16行目は、throw文で例外を投げています。Javaと違いここでthrowが必要です。
8行目は、例外をcatchしメッセージを表示します。「エラーです」
10行目は、finallyブロックでメッセージが表示されます。「処理が終了しました」

 

独自の例外を作成する

作成するアプリに合わせた独自の例外を作成することで、例外ハンドリングを容易にし保守性と可読性を上げることができます。

独自の例外を作成するには、Exceptionクラスを継承します。

<?php
$num1 = 1;

try{
	echo calc1($num1);
}catch(TestError1 $e){
	echo $e;
}finally{
	echo "処理が終了しました";
}
function calc1($a){
	if( $a === 1 ){
		throw new TestError1;
	}
	return $a;
}
class TestError1 extends Exception
{
	function __toString()
	{
		return "独自の例外です";
	}
}
?>

17行目で、Exceptionクラスを継承して独自の例外を作成しています。
19行目の__toStringは、Exceptionクラスにあるメソッドです。
オーバーライドすることにより、独自の文字列を出力するようにしています。
6行目にcatchブロックがあります。「独自の例外です」と表示されます。

 

Warningをcatchする

上記のtry-catchではwarningはcatchできません。
error_reportingの設定とカスタムのエラーハンドラを登録します。

<?php
error_reporting(E_WARNING);
set_error_handler(function($errno, $errstr, $errfile, $errline) {
  throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
});

$url = 'D:\xampp\htdocs\test\test1.txt';
$filename = basename($url);
$savePath = 'D:\work\\' . $filename;

try{
	$result = file_put_contents($savePath, file_get_contents($url));
  echo 'ダウンロードが成功しました。';
}catch(ErrorException $e){
  echo 'ダウンロードに失敗しました。';
}
?>

2行目は、error_reportingの設定をしています。
3行目は、カスタムのエラーハンドラを登録しています。
14行目は、上記の設定によりWarningをキャッチできるようになります。

設定はphp.iniへ記述できます。

関連の記事

PHPクラスの仕組みと使い方のサンプル
PHP クラスの継承の仕組みとサンプル

△上に戻る