web-dev-qa-db-ja.com

PHP try-catchが機能しない

_try     
{
    $matrix = Query::take("SELECT moo"); //this makes 0 sense

    while($row = mysqli_fetch_array($matrix, MYSQL_BOTH)) //and thus this line should be an error
    {

    }

    return 'something';
}
catch(Exception $e)
{
    return 'nothing';   
}
_

ただし、一部をキャッチしてnothingを返すのではなく、whileで始まる行に警告Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, null givenを表示します。私はphpで例外を使用することを思いつきませんでしたが、C#でそれらを頻繁に使用しましたが、PHPで動作が異なっているようです。

警告/エラーは例外ではないため、try-catchブロックでは処理できません。警告/エラーを処理する場合は、独自のエラーハンドラを set_error_handler で登録する必要があります。

ただし、この問題は防ぐことができるため、修正することをお勧めします。

32
Philipp

例外はThrowableのサブクラスのみです。エラーをキャッチするには、次のいずれかを実行してみます。

try {

    catch (\Exception $e) {
       //do something when exception is thrown
}
catch (\Error $e) {
  //do something when error is thrown
}

またはより包括的なソリューション

try {

catch (\Exception $e) {
   //do something when exception is thrown
}
catch (\Throwable $e) {
  //do something when Throwable is thrown
}

ところで:Javaは同様の動作をします。

8
Gilad Tiram

PHPでは、警告は例外ではありません。一般に、防御コーディングを使用して、期待どおりの結果が得られるようにすることがベストプラクティスです。

6
datasage

残念ながら、これはPHPに関する問題です。 try/catchステートメントは例外をキャッチしますが、受け取っているのは昔ながらのPHPエラーです。

次のようにして、このようなエラーをキャッチする必要があります: http://php.net/manual/en/function.set-error-handler.php

それか、mysqli_fetch_arrayを実行する前に、$ matrixがmysqli_resultオブジェクトであるかどうかを確認してください。

4
normmcgarry

PHPは例外ではなく警告を生成します。警告をキャッチできません。これらは、C#のコンパイラ警告に似ています。

1
adhominem