2012-09-11 87 views
11
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中它们的工作方式不同,或者像往常一样,我错过了明显的东西。PHP的try-catch不工作

+0

这里有一些像你的问题:http://stackoverflow.com/questions/1241728/can-i-try-catch-a-warning –

+0

Duplicate:http://stackoverflow.com/questions/1241728/can- i-try-catch-a-warning – wesside

+0

阅读本文http://phpmaster.com/error-handling-in-php/ – vascowhite

回答

18

您不能使用try-catch块处理警告/错误,因为它们不是例外。如果你想处理警告/错误,你必须注册你自己的错误处理程序set_error_handler

但是最好解决这个问题,因为你可以阻止它。

+0

建立在这个答案上,你可以很容易地设置set_error_handler来捕获PHP错误并发出一个异常,此时你的try-catch将起作用。我相信你可以通过Google寻找合适的东西。 –

+0

对于抛出异常,set_error_handler应该与ErrorException(专门用于此用途的内置类)结合使用。 –

+0

我已经做了几年的PHP全职工作,我甚至不知道这一点。 –

6

在PHP中,警告不是例外。一般来说,最好的做法是使用防御性编码来确保结果是你期望的结果。

3

不幸的是,这是关于PHP的问题。 Try/catch语句将捕获异常,但您收到的是一个老派的PHP错误。

你必须抓住这样的错误有: http://php.net/manual/en/function.set-error-handler.php

如果不是这样,请检查是否$矩阵是之前执行mysqli_fetch_array一个mysqli_result对象。

+0

老派PHP错误处理对我有用。谢谢你指出我正确的方向! – Clomp

1

PHP正在生成一个警告,而不是一个例外。警告不能被发现。它们更像C#中的编译器警告。

0

异常只是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 
} 

BTW:Java有类似的行为。