エラーハンドラ
エラーハンドラ – 柔軟なエラーハンドラプラグインシステム
導入
HTML_CSS パッケージには、柔軟なエラーハンドラプラグインシステムが組み込まれており、
お好みのエラーハンドラを使用することができます。
PEAR_Error オブジェクト (デフォルト) 以外にも
PEAR_ErrorStack パッケージや
その他のエラーハンドラをプラグインすることができます。
何も設定をしなければ、HTML_CSS の API で発生したエラー (普通のエラーや例外)
は HTML_CSS_Error オブジェクトを生成して呼び出し元
(ユーザスクリプト) に返します。
他の PEAR パッケージが出した PEAR_Error と HTML_CSS のエラーを区別する簡単な方法は
HTML_CSS::isError() です。
また、エラーのレベル (警告、エラー、例外) を取得するには
HTML_CSS_Error::getLevel() メソッドを使用します。
使い慣れた PEAR のエラー処理用 API も使えます。
<?php
require_once 'HTML/CSS.php';
$css = new HTML_CSS();
$result = $css->setStyle('div', 'color', 5);
if (PEAR::isError($result)) {
// 何らかのエラー処理
}
?>
出力結果は、このようになるでしょう。
この標準の挙動では不満があるかもしれませんが、心配無用です。
すべてを変更することができます。
HTML_CSS は、
display_errors
および
log_errors
のプロトコルに従っています。
ハンドラの設定
エラーハンドラを設定するには、コンストラクタの引数を使用します。
パラメータの概要を、以下に示します。
<?php
require_once 'HTML/CSS.php';
$errorConf = array('error_handler' => 'myErrorHandler',
'push_callback' => 'myError',
// ... その他のオプション
);
$css = new HTML_CSS(null, $errorConf);
?>
エラーハンドラの設定パラメータ
オプション |
型 |
説明 |
error_handler |
callback |
HTML_CSS::raiseError()
メソッドが実行するエラー処理用のコールバック (関数)。
デフォルトは HTML_CSS::_errorHandler。
|
push_callback |
callback |
以下のアクションを決定するコールバック (関数)。
デフォルトの返り値は、例外の場合は PEAR_ERROR_DIE、
それ以外の場合は NULL。
|
error_callback |
callback |
後始末用のユーザ関数をコールすることを決定するコールバック (関数)。
デフォルトは、なし。
|
message_callback |
callback |
メッセージの生成を制御するコールバック (関数)。
デフォルトは HTML_CSS_Error::_msgCallback。
|
context_callback |
callback |
エラーコンテキストの生成を制御するコールバック (関数)。
デフォルトは HTML_CSS_Error::getBacktrace。
|
handler |
mixed |
ハンドラ固有の設定。
|
エラーの発生の制御
より綿密なエラー処理が必要となる場面も多々あります。
エラーの発生を制御する第一段階は、php.ini の設定項目
display_errors と log_errors です。
これらを TRUE にすると、それぞれブラウザ向けとファイル向けの出力が有効になります。
すべてのエラーを無視したい (画面にもログファイルにも出力しない)、
そして PEAR のコアクラスをインクルードせずに済ませたいという場合は、
このように設定します。
<?php
require_once 'HTML/CSS.php';
function myErrorHandler()
{
return null;
}
$errorConf = array('error_handler' => 'myErrorHandler');
$css = new HTML_CSS(null, $errorConf);
// ...
?>
HTML_CSS 1.4.0 以降のユーザ向けの注意
エラーを画面に出力するかどうか、そしてログファイルに記録するかどうかを、
HTML_CSS の関数コールで設定することもできます。
<?php
require_once 'HTML/CSS.php';
function myErrorAction($css_error)
{
// $css_error は HTML_CSS_Error オブジェクトのインスタンスです。
// これを画面に表示するなりログに記録するなりお好みの処理をします。
}
$errorConf = array('error_callback' => 'myErrorAction');
$css = new HTML_CSS(null, $errorConf);
// ...
?>
あるいは、PEAR そのもののエラーハンドラ (PEAR::setErrorHandling,
PEAR::pushErrorHandling, PEAR::popErrorHandling) を利用することもできます。
<?php
require_once 'HTML/CSS.php';
function myErrorAction($css_error)
{
// $css_error は HTML_CSS_Error オブジェクトのインスタンスです。
// これを画面に表示するなりログに記録するなりお好みの処理をします。
}
PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'myErrorAction');
$css = new HTML_CSS();
// ...
?>
オプション push_callback を指定すると、
スクリプトの実行を停止する (例外の場合はデフォルトでこうなります:
定数 PEAR_ERROR_DIE を返します)
かフィルタリングなしで続行する
(NULL を返します)
かどうかを決められます。
独自のコールバック関数を push_callback
に指定する場合、その関数は 2 つの引数をとるものでなければなりません。
最初の引数はエラーコード、次の引数がエラーレベルとなります。
フィルタリングに必要な情報はこれらだけです。
以下の例は、スクリプトで引数の型を間違えた場合の処理を示すものです。
<?php
require_once 'HTML/CSS.php';
function myErrorFilter($code, $level)
{
if ($code === HTML_CSS_ERROR_INVALID_INPUT) {
error_log('script: '.__FILE__.' used wrong argument data type', 1, 'admin@yoursite.com');
}
return null;
}
$errorConf = array('push_callback' => 'myErrorFilter');
$css = new HTML_CSS(null, $errorConf);
// ...
?>
エラーコンテキストの表示
場合によっては生成されるエラーの内容をカスタマイズしたくなるかもしれません。
たとえば、個々のエラー (普通のエラー/例外) に対して発生時のファイル名や行番号、
クラスや関数といった情報を含めると便利でしょう。
たいていはデフォルトのオプションで十分でしょうが、
コンテキスト情報の出力フォーマットを変更したくなるかもしれません。
この例では、画面表示とログ出力の内容を変更します。
<?php
require_once 'HTML/CSS.php';
$displayConfig = array(
'lineFormat' => '<b>%1$s</b>: %2$s<br />%3$s',
'contextFormat' => '<b>ファイル名:</b> %1$s <br />'
. '<b>行番号:</b> %2$s <br />'
. '<b>関数名:</b> %3$s '
);
$logConfig = array(
'lineFormat' => '%1$s %2$s [%3$s] %4$s',
'timeFormat' => '%b'
);
$prefs = array(
'handler' => array('display' => $displayConfig,
'log' => $logConfig
));
$css = new HTML_CSS(null, $prefs);
// ...
$result = $css->setStyle('div', 'color', 5);
?>
画面表示の内容は、次のようになります。
ログの出力内容は、このようになります。
画面出力やログ出力をするには、それぞれ php.ini の
display_errors と log_errors
が TRUE になっていなければなりません。
では、この結果をどのようにして得たのかを順を追ってみていきましょう。
デフォルトのクラスには、ふたつのドライバ
display と log
があることを覚えておきましょう。これらにはそれぞれ独自の設定パラメータがあります。
これらのパラメータの値を書き換えるには、HTML_CSS
クラスのコンストラクタの 2 番目の引数で指定するハッシュの
handler エントリを使用します。
それを行っているのが、変数 $prefs
です。
この変数は 2 つのキーを持つ連想配列で、最初のキー display
で表示用ドライバの値、2 番目のキー log
でログ出力用のドライバの値を設定します。
では、display ドライバの設定を見てみましょう。
ここで再定義しているのは
の 2 つだけです。つまり、残りのキーである
についてはデフォルト値をそのまま使用するということです。以下の表を参照ください。
表示用ドライバの設定パラメータ
パラメータ |
型 |
デフォルト |
説明 |
eol |
string |
<br />\n |
行末文字シーケンス |
lineFormat |
string |
<b>%1$s</b>: %2$s %3$s |
ログに記録するフォーマットの指定:
1$ = エラーレベル
2$ = エラーメッセージ (本文)
3$ = エラーコンテキスト
|
contextFormat |
string |
in <b>%3$s</b> (file <b>%1$s</b> on line <b>%2$s</b>)
|
コンテキストのフォーマット (クラス、ファイル、行番号) の指定:
1$ = スクリプトのファイル名
2$ = スクリプトファイルの行番号
3$ = クラス/メソッド名
|
エラーメッセージにコンテキスト情報を表示させたくない場合は、
lineFormat オプションのパラメータ %3$
を削除しましょう。そうすれば、
contextFormat が設定されていても表示されません。
では、次に log ドライバの独自設定を見てみましょう。
ここで再定義しているのは
の 2 つだけなので、残りの 6 つのキー
- eol
- contextFormat
- ident
- message_type
- destination
- extra_headers
についてはデフォルト値をそのまま使用します。以下の表を参照ください。
ログ出力用ドライバの設定パラメータ
パラメータ |
型 |
デフォルト |
説明 |
eol |
string |
\n |
行末文字シーケンス |
lineFormat |
string |
%1$s %2$s [%3$s] %4$s %5$s |
ログに記録するフォーマットの指定:
|
contextFormat |
string |
in %3$s (file %1$s on line %2$s) |
コンテキストのフォーマット (クラス、ファイル、行番号) の指定:
1$ = スクリプトのファイル名
2$ = スクリプトファイルの行番号
3$ = クラス/メソッド名
|
timeFormat |
string |
%b %d %H:%M:%S |
strftime
が使用するタイムスタンプのフォーマット
|
ident |
string |
REMOTE_ADDR |
クライアントの IP アドレス |
message_type |
string |
3 |
error_log
が使用する出力先の形式
|
destination |
string |
html_css_error.log |
error_log
が使用する出力先の名前
|
extra_headers |
string |
NULL |
出力先の形式に依存する追加ヘッダ |
エラーメッセージにコンテキスト情報を表示させたくない場合は、
lineFormat オプションのパラメータ %5$
を削除しましょう。そうすれば、
contextFormat が設定されていても表示されません。
独自のエラーメッセージの生成
HTML_CSS_Error には、
エラーメッセージを効率よく生成するためのメソッドが
2 つ用意されています。
これらを使用するには、以下のオプションを
HTML_CSS クラスのコンストラクタ (2 番目の引数)
で指定する必要があります。
オプション: message_callback
デフォルトのメッセージ処理コールバック
(HTML_CSS_Error::_getErrorMessage)
は、エラーコードとエラーメッセージテンプレートを対応させた
次のような配列を受け取ります。
<?php
$messages = array(
HTML_CSS_ERROR_UNKNOWN =>
'unknown error',
HTML_CSS_ERROR_INVALID_INPUT =>
'invalid input, parameter #%paramnum% '
. '"%var%" was expecting '
. '"%expected%", instead got "%was%"'
);
?>
基本的に、パーセント記号 (%) で囲まれている変数名は
連想配列の値で置き換えられます。
オプション: context_callback
デフォルトのコンテキスト処理コールバック
(HTML_CSS_Error::getBackTrace)
は、実行した関数の配列を受け取ってエラーが発生した位置を見つけます。