15

背景:次の明らかに間違った PHP があるとします。

    try{
        $vtest = '';
        print(array_pop($vtest));
    }catch(Exception $exx){}

array_pop で動作させるには、$vtest は明らかに文字列ではなく配列である必要があります。それにもかかわらず、このコードを実行すると、警告が表示されます。私はそれを望んでいません。コードが静かに失敗することを望んでいます。

質問:他の言語と比較して、PHP の try-catch が機能しない原因となる特別な点はありますか?

免責事項: 参考までに、PHP でこの状況を処理する他の方法があることは事実ですが、これらは望ましくありません。ここでの目標は、次のことを回避することです。

「アットマーク」トリック:

        $vtest = '';
        print(@array_pop($vtest)); // <-- would like to avoid this

型キャスト:

        $vtest = '';
        $vtest = (array)$vtest;  
        print(array_pop($vtest));
4

4 に答える 4

14

PHP では、警告と通知は技術的な例外ではありません。例外をキャッチするには、例外を明示的にスローする必要があり、関数の組み込みライブラリの多くは例外をスローしません (ほとんどの場合、それらは PHP が例外をサポートする前に作成されたためです)。

既存の通知/警告/エラー フレームワークの上に何らかの例外が構築されていればよかったのですが、おそらくそれは要求が多すぎます。

于 2009-07-06T14:51:06.657 に答える
12

指定したコードによって常に警告が生成されますが、set_error_handlerを使用して警告の処理方法を指定できます。つまり、例外をスローさせることができます。さらに、 restore_error_handlerを使用して、完了時にデフォルトのエラー処理に戻すことができます。

function errorHandler($errno, $errstr, $errfile, $errline) {
    throw new Exception($errstr, $errno);
}
set_error_handler('errorHandler');
于 2009-07-06T14:55:29.490 に答える
2

すべてのエラーを例外に変換すると、このようなエラーをキャッチできます。ちょっとしたエラー処理環境をセットアップしました。テストするだけで動作します。

于 2009-07-06T14:54:14.703 に答える
0

私が考えることができる唯一の方法は、次のことを行うことです:

try{
    $vtest = '';
    if(is_array($vtest)){
        print(array_pop($vtest));
    }
    else{
        throw new NotArrayException()
    }
}catch(NotArrayException $exx){}

もちろん、これを黙って実行したい場合は、例外をキャッチする必要がないため、次のように実行できます。

    $vtest = '';
    if(is_array($vtest)){
        print(array_pop($vtest));
    }
于 2009-07-06T14:49:27.410 に答える