Reputation: 8578
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';
}
However instead of just going to catch part and returning nothing
it shows a warning Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, null given
in the line starting with while
. I have never came up to using exceptions in php, but used them a lot in C# and it seems in PHP they are working differently or, as always, I am missing something obvious.
Upvotes: 38
Views: 61516
Reputation: 549
Exception is only subclass of Throwable. To catch error you can try to do one of the following:
try {
catch (\Exception $e) {
//do something when exception is thrown
}
catch (\Error $e) {
//do something when error is thrown
}
OR more inclusive solution
try {
catch (\Exception $e) {
//do something when exception is thrown
}
catch (\Throwable $e) {
//do something when Throwable is thrown
}
BTW : Java has similar behaviour.
Upvotes: 43
Reputation: 15639
You can't handle Warnings/Errors with try-catch blocks, because they aren't exceptions. If you want to handle warnings/errors, you have to register your own error handler with set_error_handler
.
But it's better to fix this issue, because you could prevent it.
Upvotes: 44
Reputation: 1144
PHP is generating a warning, not an exception. Warnings can't be caught. They are more like compiler warnings in C#.
Upvotes: 1
Reputation: 681
Welp, unfortunately this is the issue about PHP. Try/catch statements will catch Exceptions, but what you're receiving is an old-school PHP error.
You'll have to catch an error like this with: http://php.net/manual/en/function.set-error-handler.php
Either that or check to see if $matrix is a mysqli_result object prior to performing mysqli_fetch_array.
Upvotes: 4
Reputation: 19573
In PHP a warning is not an exception. Generally the best practice would be to use defensive coding to make sure the result is what you expect it to be.
Upvotes: 7