引用:
try/catch と異なり、特定のエラーが特定の Page クラスで発生した場合に、固有の処理を行いたいといったケースが少々難しそうですね。
require_base.phpあたりでset_error_handlerして、LC_Pageでそれまでに捕まえたエラーをウンヌンするという考えでした。
単にエラーになりそうな箇所をset_error_handlerとrestre_error_handlerでサンドイッチして、その間のエラーだけ収集したほうがいいかな。
<?php
/* ▼▼ ErrorHandler ▼▼ */
class ErrorHandler {
var $list = array();
function ErrorHandler($name = '') {
static $err_stock = array();
$this->name = $name;
$this->list =& $err_stock;
$this->pos = count($this->list);
if(version_compare(phpversion(), '5.0.0', '>=')) {
set_error_handler(array(&$this, 'set'), E_ALL);
} else {
set_error_handler(array(&$this, 'set'));
}
echo "▼ $this->name エラーハンドラをセットしました\n";
register_shutdown_function(array(&$this, 'destroy'));
}
function set($errno, $errstr, $errfile, $errline) {
for($i = 0; $i < ($this->pos + 1); $i++) {
$this->list[$i][] = "[$errno] $errstr $errfile $errline";
}
}
function get() {
$message = '';
while(count($this->list[$this->pos])) {
$message .= $this->name . array_pop($this->list[$this->pos]) . "\n";
}
return $message;
}
function isError() {
return !empty($this->list[$this->pos]);
}
function reset() {
restore_error_handler();
unset($this->list[$this->pos]);
echo "▲ $this->name エラーハンドラを破棄しました\n";
}
function destroy() {
unset($this->list);
restore_error_handler();
}
}
/* ▼▼ Mail ▼▼ */
class Helper_Mail {
function sendOrder() {
$objMail = new Send_Mail_Ex;
$objErr = new ErrorHandler('['.get_class($this).']'); // ▼▼ set_error_handler ▼▼
$objMail->sendMail();
if($objErr->isError()) {
echo "エラー処理\n";
}
$objErr->reset(); // ▲▲ restre_error_handler ▲▲
}
}
class Send_Mail_Ex extends Send_Mail{
function Send_Mail_Ex() {
parent::Send_Mail();
}
}
class Send_Mail {
function Send_Mail() {
$buf = 1 / 0; // error
}
function sendMail() {
trigger_error('Send_Mail の sendMail() でエラー'); // error
}
}
/* ▼▼ LC_Page_hoge ▼▼ */
trigger_error('set_error_handlerする前にtrigger_error');
echo "<pre>";
$obj = new ErrorHandler('[LC_Page_hoge1]'); // ▼▼ set_error_handler ▼▼
trigger_error('LC_Page_hoge の process() でエラー'); // error
$c = new Helper_Mail;
$c->sendOrder();
echo $obj->get();
$obj->reset(); // ▲▲ restre_error_handler ▲▲
$obj = new ErrorHandler('[LC_Page_hoge2]'); // ▼▼ set_error_handler ▼▼
$objMail = new Send_Mail_Ex(); // error
echo $obj->get();
$obj->reset(); // ▲▲ restre_error_handler ▲▲
echo "</pre>";
?>
追記:入れ子にしたときに使えなさそな動きをしていたので修正(汗)