PHP自定义异常处理程序是否需要try {} catch?

时间:2012-08-03 16:44:26

标签: php exception exception-handling custom-exceptions

我编写了以下自定义异常处理程序:

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(即性能/安全性等)执行此操作是否有任何不利之处?

2 个答案:

答案 0 :(得分:3)

您不必,但无法恢复 - 使用try / catch为您提供了对特定异常做出反应的优势(例如some_custom_session_handling()中找不到的文件可能是使用try / catch和log的好地方没有会话文件的这样的用户。)

所以优点是你有更漂亮的消息。缺点是您将异常视为始终相同。它本身并不坏,不应该降低性能或安全性,但它首先忽略了使用异常的重点。

但是,它并不排除在您可能需要的地方使用try / catch,所以我认为这是一个很好的故障转移解决方案,但应该避免作为try / catch替换

答案 1 :(得分:0)

正如jderda所说,使用你的方法你会忽略例外:检查代码上层的任何错误并对它们作出反应 - 停止或处理异常并继续。例如,当您想要记录所有未捕获的异常

时,您的方法很好