Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP尝试捕获不工作_Php_Exception_Try Catch - Fatal编程技术网

PHP尝试捕获不工作

PHP尝试捕获不工作,php,exception,try-catch,Php,Exception,Try Catch,然而,它并没有仅仅捕获部分并返回nothing,而是显示了一条警告警告:mysqli_fetch_array()期望参数1是mysqli_result,而在开头的行中给定null。我从来没有想到在php中使用异常,但在C#中使用了很多异常,而且在php中它们的工作方式似乎不同,或者像往常一样,我遗漏了一些明显的东西 在PHP中,警告不是例外。一般来说,最佳做法是使用防御性编码,以确保结果符合您的预期。您无法使用try-catch块处理警告/错误,因为它们不是例外。如果要处理警告/错误,必须向注册

然而,它并没有仅仅捕获部分并返回
nothing
,而是显示了一条警告
警告:mysqli_fetch_array()期望参数1是mysqli_result,而在
开头的行中给定null
。我从来没有想到在php中使用异常,但在C#中使用了很多异常,而且在php中它们的工作方式似乎不同,或者像往常一样,我遗漏了一些明显的东西

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

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


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

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

您必须通过以下方法捕获类似的错误:


或者在执行mysqli_fetch_数组之前检查$matrix是否是mysqli_结果对象。

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

Exception是Throwable的唯一子类。要捕获错误,您可以尝试执行以下操作之一:

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';   
}
或更具包容性的解决方案

try {

    catch (\Exception $e) {
       //do something when exception is thrown
}
catch (\Error $e) {
  //do something when error is thrown
}

顺便说一句:Java也有类似的行为

这里有一些类似于你的问题:重复:阅读这个@SirDarius-有趣且值得一读的链接。谢谢:)基于这个答案,您可以轻松地设置set_error_处理程序来捕获PHP错误并发出异常,此时您的try-catch将工作。我相信你可以在谷歌上搜索一些合适的东西。为了抛出异常,set_error_处理程序应该与ErrorException(专门用于此用途的内置类)结合使用。我已经全职做php几年了,但我甚至不知道这一点。老式的php错误处理对我来说很有用。谢谢你给我指明了正确的方向!我使用了
\Exception
而不是
Exception
,它成功了。你能详细说明一下
异常
之前的\(斜杠)是如何在这里产生巨大差异的吗?@Shashanth使用
异常
而不使用斜杠假定你有
使用异常语句,或者不使用名称空间,
\
使它看起来像全局PHP名称空间,因此它将捕获一个PHP
异常和基于它的任何类-官方文档:在现代PHP中,使用名称空间时,包含“\”是必不可少的。
try {

catch (\Exception $e) {
   //do something when exception is thrown
}
catch (\Throwable $e) {
  //do something when Throwable is thrown
}