_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
で登録する必要があります。
ただし、この問題は防ぐことができるため、修正することをお勧めします。
例外は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は同様の動作をします。
PHPでは、警告は例外ではありません。一般に、防御コーディングを使用して、期待どおりの結果が得られるようにすることがベストプラクティスです。
残念ながら、これはPHPに関する問題です。 try/catchステートメントは例外をキャッチしますが、受け取っているのは昔ながらのPHPエラーです。
次のようにして、このようなエラーをキャッチする必要があります: http://php.net/manual/en/function.set-error-handler.php
それか、mysqli_fetch_arrayを実行する前に、$ matrixがmysqli_resultオブジェクトであるかどうかを確認してください。
PHPは例外ではなく警告を生成します。警告をキャッチできません。これらは、C#のコンパイラ警告に似ています。