32
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显示警告。我从来没有想过在 php 中使用异常,但在 C# 中经常使用它们,而且在 PHP 中它们的工作方式似乎不同,或者像往常一样,我遗漏了一些明显的东西。Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, null givenwhile

4

5 回答 5

42

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

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

于 2012-09-11T20:54:03.267 回答
28

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

于 2018-01-11T07:49:12.373 回答
6

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

于 2012-09-11T20:53:26.497 回答
4

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

您必须通过以下方式捕获这样的错误:http: //php.net/manual/en/function.set-error-handler.php

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

于 2012-09-11T20:55:08.370 回答
1

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

于 2012-09-11T20:59:58.383 回答