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使用异常
而不使用斜杠假定你有使用异常顶部的code>语句,或者不使用名称空间,\
使它看起来像全局PHP名称空间,因此它将捕获一个PHP异常和基于它的任何类-官方文档:在现代PHP中,使用名称空间时,包含“\”是必不可少的。
try {
catch (\Exception $e) {
//do something when exception is thrown
}
catch (\Throwable $e) {
//do something when Throwable is thrown
}