PHP try-catch无法正常工作

时间:2012-09-11 20:50:45

标签: php exception 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,而是在以Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, null given开头的行中显示警告while。我从来没有在php中使用异常,但在C#中使用它们很多,而且在PHP中看起来它们的工作方式不同,或者像往常一样,我遗漏了一些明显的东西。

5 个答案:

答案 0 :(得分:26)

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

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

答案 1 :(得分:6)

在PHP中,警告不是例外。通常,最好的做法是使用防御性编码来确保结果符合您的预期。

答案 2 :(得分:4)

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

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

或者在执行mysqli_fetch_array之前检查$ matrix是否是mysqli_result对象。

答案 3 :(得分:3)

异常只是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有类似的行为。

答案 4 :(得分:1)

PHP正在生成警告,而不是例外。警告无法捕获。它们更像是C#中的编译器警告。