我编写了以下自定义异常处理程序:
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 (即性能/安全等)这样做有什么缺点吗?