0

私はPHPの初心者なので、これは些細なことに聞こえるかもしれませんこれが私のPHPコードです

<?php
try
{
    echo "Hello";
}
catch (Exception $e)
{
    echo $e;
}
?>

これは出力しますHello

今、例外を取得するようにコードを変更しました

<?php
try
{
    ech "Hello";
}
catch (Exception $e)
{
    echo $e;
}
?>

しかし、それは何も印刷しません。キャッチはエラーを出力するはずではありませんか.それとも私は何か間違ったことをしていますか?

4

3 に答える 3

3

あなたが探しているのは ですErrorException

次のようにエラー ハンドラを登録できます。

function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
set_error_handler("exception_error_handler");

そしてエラーをキャッチします:

try
{
    echo $a; //Use of undefined variable
}
catch (ErrorException $e)
{
    echo $e->getMessage();
}

しかし、php でも他の言語でも、構文エラーを例外として処理することはできません。実際に php スクリプトを実行すると致命的なエラーが発生するのは、php が解釈されるためです。任意の php コンパイラで php スクリプトをコンパイルしようとすると、コンパイル時に構文エラーが発生します。

致命的なエラーが発生したときにログなどを追加したい場合は、シャットダウン機能を登録できます (を使用register_shutdown_function):

register_shutdown_function( "MyShutDownHandler" );

function MyShutDownHandler() {
    //Do something here.
}
于 2013-01-28T13:58:56.557 に答える
2

いいえ、これは構文エラー (または PHP 用語での解析エラー) です。そもそもコードが実行されることはないため、例外がスローされることはありません。

また、PHP 5 で例外が導入され、古いエラー システムが削除されていないため、PHP コア関数も例外をスローしないことに注意してください。そのため、エラー (コア、古い拡張機能) と例外 (新しい OO 拡張機能、ユーザーランド コード) を同時に処理する必要があります。(リンクされたマニュアルページの例を参照)でこれを部​​分的に回避できますErrorExceptionが、それでも面倒です。

于 2013-01-28T13:54:49.847 に答える
0

@PLBと@fabによって与えられた素晴らしい答えにもう1つ追加したいと思います。

例外をキャッチするには、それをスローする必要があります(一種の意味がありますか?:P)。

私が非常に気に入っている1つの例は、0による除算の処理です。

function divide($x, $y) {
    if ($y == 0) {
        $up = new Exception('Cannot divide by 0');
        throw $up; // :)
    }
    return $x/$y;
}

try {
    divide(3, 0);
    // more code can be added here, but is skipped if Exception is thrown.
} catch(Exception $e) {
    echo $e->getMessage();
}

では、なぜこれがif関数内のステートメントの改善なのですか?

throw1つは、との間のコードを手動でスキップする必要がないことですcatch。独自の例外を設定することができ(いくつかのカスタム機能を使用して、必要に応じてログに記録することもできます)、それらはキャッチされるまでコールスタックを自動的に通過します。

于 2013-01-28T14:16:27.807 に答える