1

次のカスタム例外ハンドラーを作成しました。

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(つまり、パフォーマンス/セキュリティなど)を介してこれを行うのではなく、キャッチされなかったすべての例外をキャッチさせることによる不利な点はありますか?

4

2 に答える 2

3

必ずしもそうする必要はありませんが、回復することはできません-try / catchを使用すると、特定の例外に対応できるという利点があります(たとえば、some_custom_session_handling()にないファイルは、try / catchを使用して、そのようなユーザーをログアウトするのに適した場所です。セッションファイルなし)。

したがって、利点は、よりきれいなメッセージがあることです。欠点は、例外を常に同じように扱うことです。それ自体は悪くはなく、パフォーマンスやセキュリティを低下させることはありませんが、そもそも例外を使用するという点を見逃しています。

ただし、必要な場所でのtry / catchの使用を除外するものではないため、これは優れたフェイルオーバーソリューションであると言えますが、try/catchの代わりとして使用することは避けてください。

于 2012-08-03T16:49:10.087 に答える
0

jderdaが言ったように、あなたは例外のポイントを逃しているあなたのアプローチを使用しています:あなたのコードの上位レベルのエラーをチェックしてそれらに反応する-例外を停止または処理して次に進みます。たとえば、キャッチされなかったすべての例外をログに記録する場合は、アプローチは問題ありません。

于 2012-08-03T16:56:22.483 に答える