PHP 5 は、他のプログラミング言語に似た例外モデルを有しています。 PHP 内で例外が投げられ ("
throw
" され)、それが 捕捉され ("
catch
" され) ます。発生した例外を 捕捉するには、コードを
try
ブロックで囲みます。 各
try
ブロックには、対応する
catch
ブロックが存在する必要があります。異なる型の例外を捕捉するために 複数の
catch
フロックを使用することができます。 通常の実行時 (
try
ブロック内で例外が投げられなかった 場合、あるいは投げられた例外に対応する
catch
ブロックが存在しなかった場合) は、
catch
ブロック内は処理されず、それ以降から処理が続けられます。
catch
ブロックの中から例外を投げる (あるいは投げなおす) こともできます。
例外が投げられた場合、その命令に続くコードは実行されず、 PHP は最初にマッチする
catch
ブロックを探します。 例外が捕捉されない場合、PHP は "
Uncaught Exception ...
" というメッセージとともに 致命的なエラー(fatal error)を発行します。 ただし、
set_exception_handler()
でハンドラが 定義されている場合を除きます。
例 20-1. 例外を投げるには
<?php
try
{
$error
=
'Always throw this error'
;
throw
new
Exception
(
$error
);
// 例外に続くコードは実行されない
echo
'Never executed'
;
}
catch
(
Exception $e
) {
echo
'Caught exception: '
,
$e
->
getMessage
(),
"\n"
;
}
// 実行は継続される
echo
'Hello World'
;
?>
|
|
組み込みの Exception クラスを拡張することで、例外クラスをユーザーが 定義することが可能です。以下のメンバーおよびプロパティは、 組み込みの Exception クラスから派生した子クラスの中でアクセス可能です。
例 20-2. 例外クラスを構築する
<?php
class
Exception
{
protected $message
=
'Unknown exception'
;
// exception message
protected $code
=
0
;
// user defined exception code
protected $file
;
// source filename of exception
protected $line
;
// source line of exception
function
__construct
(
$message
=
null
,
$code
=
0
);
final
function
getMessage
();
// message of exception
final
function
getCode
();
// code of exception
final
function
getFile
();
// source filename
final
function
getLine
();
// source line
final
function
getTrace
();
// an array of the backtrace()
final
function
getTraceAsString
();
// formated string of trace
/* Overrideable */
function
__toString
();
// formated string for display
}
?>
|
|
クラスが、組み込みの Exception クラスを拡張し、
コンストラクタ
を再定義した場合、 全ての利用可能なデータが正しく代入されることを保証するために
parent::__construct()
もコールすることが強く推奨されます。
__toString()
メソッドは、 オブジェクトが文字列として表された際に独自の出力を行うために 上書きすることができます。
例 20-3. 例外クラスを拡張する
<?php
/**
* カスタム例外クラスを定義する
*/
class
MyException
extends
Exception
{
// 例外を再定義し、メッセージをオプションではなくする
public
function
__construct
(
$message
,
$code
=
0
) {
// なんらかのコード
// 全てを正しく確実に代入する
parent
::
__construct
(
$message
,
$code
);
}
// オブジェクトの文字列表現を独自に定義する
public
function
__toString
() {
return
__CLASS__
.
":
[{
$this
->
code
}]
:
{
$this
->
message
}\n
"
;
}
public
function
customFunction
() {
echo
"A Custom function for this type of exception\n"
;
}
}
/**
* 例外をテストするためのクラスを作成
*/
class
TestException
{
public $var
;
const
THROW_NONE
=
0
;
const
THROW_CUSTOM
=
1
;
const
THROW_DEFAULT
=
2
;
function
__construct
(
$avalue
=
self
::
THROW_NONE
) {
switch (
$avalue
) {
case
self
::
THROW_CUSTOM
:
// カスタム例外を投げる
throw
new
MyException
(
'1 is an invalid parameter'
,
5
);
break;
case
self
::
THROW_DEFAULT
:
// デフォルト例外を投げる
throw
new
Exception
(
'2 isnt allowed as a parameter'
,
6
);
break;
default:
// 例外なし。オブジェクトが生成される
$this
->
var
=
$avalue
;
break;
}
}
}
// 例1
try
{
$o
= new
TestException
(
TestException
::
THROW_CUSTOM
);
}
catch
(
MyException $e
) {
// Will be caught
echo
"Caught my exception\n"
,
$e
;
$e
->
customFunction
();
}
catch
(
Exception $e
) {
// Skipped
echo
"Caught Default Exception\n"
,
$e
;
}
// 実行を継続する
var_dump
(
$o
);
echo
"\n\n"
;
// 例2
try
{
$o
= new
TestException
(
TestException
::
THROW_DEFAULT
);
}
catch
(
MyException $e
) {
// この型にはマッチしない
echo
"Caught my exception\n"
,
$e
;
$e
->
customFunction
();
}
catch
(
Exception $e
) {
// キャッチされる
echo
"Caught Default Exception\n"
,
$e
;
}
// 実行を継続する
var_dump
(
$o
);
echo
"\n\n"
;
// 例3
try
{
$o
= new
TestException
(
TestException
::
THROW_CUSTOM
);
}
catch
(
Exception $e
) {
// キャッチされる
echo
"Default Exception caught\n"
,
$e
;
}
// 実行を継続する
var_dump
(
$o
);
echo
"\n\n"
;
// 例4
try
{
$o
= new
TestException
();
}
catch
(
Exception $e
) {
// スキップされる、例外なし
echo
"Default Exception caught\n"
,
$e
;
}
// 実行を継続する
var_dump
(
$o
);
echo
"\n\n"
;
?>
|
|