具体的に言うと、私が望んでいることは不可能であることがわかっているコードをいくつか提示します。私は同じものを得る別の方法を探しています。
<?php
error_reporting(E_ALL | E_STRICT);
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
// When $errno is a notice, we would like a way for the execution to continue here. Since it is only a notice, eventually it could go back to where the notice was triggered.
}
set_error_handler("exception_error_handler");
Class TopLevelManagement {
private $genericInfo = "Very important to add in notices";
function highleveljob() {
try{
// In practice, the following statements could occur below in the execution tree, after a few other function calls.
$specific = new SpecificAndEncapsulated();
$specific->specificjob();
}
catch (ErrorException $e) {
$message = $e->getMessage() . $this->genericInfo;
mail($admin_email, "Consider the generic info and recover from this situation", $message);
// Here we would like the execution to continue where the exception was thrown. In the real world, this would be like "thank you error handler for SpecificAndEncapsulated::specificjob, we have taken care of the issue with the help of our larger perspective.".
}
}
}
Class SpecificAndEncapsulated {
function specificjob() {
// Some processing
if($unexpected == true) trigger_error('Here is how little I know, as I should', E_USER_NOTICE);
// Continue as expected after a notice.
}
}
?>
もちろん、1 つの解決策は$genericInfo
、パラメーターまたはグローバル変数として渡してSpecificAndEncapsulated::justdomyjob
、例外を発生させずに error_handler に問題を処理させることです。ただし、この解決策は自然ではありません。$genericInfo
変数をに体系的に渡す方法は他にもありますSpecificAndEncapsulated
が、問題は同じです。$genericInfo の値を体系的に渡す必要はありません。これはSpecificAndEncapsulated
、例外が発生した場合でも関係するものではないためです。呼び出しのたびに体系的に渡す必要はありません。通知がより高いレベルで管理された後、「ありがとう、今続行します」という例外の発行者への連絡は自然なことです。このタイプの E_NOTICE または E_USER_NOTICE 管理のサポートはありますか?