次のカスタム例外ハンドラーを作成しました。
namespace System\Exception;
class Handler extends \Exception {
public static function getException($e = null) {
if (ENVIRONMENT === 0 && is_object($e)) {
$message = "<p>";
$message .= "Exception: " . $e->getMessage();
$message .= "<br />File: " . $e->getFile();
$message .= "<br />Line: " . $e->getLine();
$message .= "<br />Trace: " . $e->getTrace();
$message .= "<br />Trace as string: " . $e->getTraceAsString();
$message .= "</p>";
} else {
$message = '<h1>Exception</h1>';
$message .= '<p>There was a problem.</p>';
}
@require_once('header.php');
echo $message;
@require_once('footer.php');
exit();
}
public static function getError($errno = 0, $errstr = null, $errfile = null, $errline = 0) {
if (ENVIRONMENT === 0) {
$message = "<p>";
$message .= "Error: " . $errstr;
$message .= "<br />File: " . $errfile;
$message .= "<br />Line: " . $errline;
$message .= "<br />Number: " . $errno;
$message .= "</p>";
} else {
$message = '<h1>Error</h1>';
$message .= '<p>There was a problem.</p>';
}
@require_once('header.php');
echo $message;
@require_once('footer.php');
exit();
}
public static function getShutdown() {
$last_error = error_get_last();
if ($last_error['type'] === E_ERROR) {
self::getError(E_ERROR, $last_error['message'], $last_error['file'], $last_error['line']);
}
}
}
そして、このクラスとそのメソッドを使用して、システムによって生成されたすべての例外とエラーを次のように処理することを示しました。
set_exception_handler(array("System\Exception\Handler", "getException"));
set_error_handler(array("System\Exception\Handler", "getError"), -1 & ~E_NOTICE & ~E_USER_NOTICE);
register_shutdown_function(array("System\Exception\Handler", "getShutdown"));
また、画面にエラーが表示されないようにし、すべてのエラーを報告するように指示しました。
ini_set('display_errors', 'Off');
error_reporting(-1);
私の質問は今です-例外やエラーをキャッチするために、try {} catch(){}ステートメントを使用する必要がありますか?上記はおそらく防弾ではないことを私は知っていますが、キャッチされていないすべての例外とエラーを処理することにより、try/catchステートメントなしでこれまでのところ機能しているようです。
また、カスタム例外ハンドラーを使用して、try {} catch(つまり、パフォーマンス/セキュリティなど)を介してこれを行うのではなく、キャッチされなかったすべての例外をキャッチさせることによる不利な点はありますか?