トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

PHP5、PHPエラーを例外(Exception)へ変換

[カテゴリ:言語]
[カテゴリ:PHP]
[カテゴリ:PHP5]

PHP5、PHPエラーを例外(Exception)へ変換(2007/10/23)

概要

ネタ元は↓こちら。

【Alex@Net】try/catch構文を用いてPHPコアで注意や警告を扱う方法 - PHPプロ!ニュース:
http://www.phppro.jp/news/185

PHP5で例外(Exception)が使えるようになった。
PHPエラー(NOTICEとか)を例外へ変換することで、PHPに関する全てのエラーを
例外として扱うことができる。

ネタ元では、PHPエラーが発生したファイル名、行番号を
Exception へ変換する処理が無いので、これを実装することを考えてみた。

流れは次の通り。

PHPエラー
   ↓
PHPエラーハンドラへ
   ↓
PHPエラーを MyException に変換して throw

以下参照しました。

PHP: 例外(exceptions) - Manual:
http://jp.php.net/manual/ja/language.exceptions.php#language.exceptions.extending

実行例

phpversion : 5.2.2
--------------
exception 'MyException' with message 'NOTICE : Undefined variable: xxx' in C:\xampp\htdocs\test.php:52
Stack trace:
#0 C:\xampp\htdocs\test.php(52): errorHandler(8, 'Undefined varia...', 'C:\xampp\htdocs...', 52, Array)
#1 C:\xampp\htdocs\test.php(56): funcA()
#2 {main}
--------------

PHPエラーとして発生した、

  • エラーメッセージ 'NOTICE : Undefined variable: xxx'
  • エラー発生場所 C:\xampp\htdocs\test.php:52

が MyException に変換されてる。

PHPエラーハンドラ経由であることが、#0 でわかる。

実行したスクリプト

<?
ini_set('display_errors', 1);
mb_internal_encoding('UTF-8');
mb_regex_encoding('UTF-8');
date_default_timezone_set('Asia/Tokyo');

echo 'phpversion : ' . phpversion() . "\n";

//
// PHPエラーを例外(Exception)へ変換
//
class MyException extends Exception
{
	public function __construct($errno, $errstr, $errfile, $errline)
	{
		// エラー番号とエラーレベルのマッピング
		$errlev = array(
			E_USER_ERROR   => 'FATAL',
			E_ERROR        => 'FATAL',
			E_USER_WARNING => 'WARNING',
			E_WARNING      => 'WARNING',
			E_USER_NOTICE  => 'NOTICE',
			E_NOTICE       => 'NOTICE',
			E_STRICT       => 'E_STRICT'
		);
	
		$add_msg= (string)$errno;
		if (isset($errlev[$errno])) {
			$add_msg = $errlev[$errno] . ' : ';
		}
		parent::__construct($add_msg . $errstr, $errno);
		$this->file = $errfile;
		$this->line = $errline;
	}
}

function errorHandler($errno, $errstr, $errfile, $errline)
{
	throw new MyException($errno, $errstr, $errfile, $errline);
}
set_error_handler('errorHandler');


//
// 以下テストコード
//

error_reporting(E_ALL|E_STRICT);

function funcA()
{
	echo $xxx;	// 意図的に、未定義の変数を参照しNOTICEを発生させる。
}

try {
	funcA();
}
catch (Exception $e) {
	echo "--------------\n";
	echo $e . "\n";
	echo "--------------\n";
}
	
?>

最終更新時間:2007年10月23日 23時12分36秒