Andrius Naruševičius
Andrius Naruševičius

Reputation: 8578

PHP try-catch not working

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

Answers (5)

Gilad Tiram
Gilad Tiram

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

Philipp
Philipp

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

adhominem
adhominem

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

normmcgarry
normmcgarry

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

datasage
datasage

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

Related Questions