【问题标题】:PHP try-catch not workingPHP try-catch 不起作用
【发布时间】:2012-09-04 20:32:19
【问题描述】:
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 exception try-catch


【解决方案1】:

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

【讨论】:

  • 我使用 \Exception 而不是 Exception 并且它有效。您能否详细说明 Exception 之前的 \(斜杠)如何在这里产生巨大的影响?
  • @Shashanth using Exception without a slash 假设您在顶部有一个 use Exception; 语句,或者没有使用命名空间,\ 使它看起来在全局 PHP 命名空间中, 所以它会捕获 PHP Exception 和任何基于它的类 - 官方文档:php.net/manual/en/class.exception.php
  • 在现代 PHP 中,使用命名空间,包含“\”是必不可少的。
  • 天才,你拯救了我的一天!
【解决方案2】:

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

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

【讨论】:

  • 在此答案的基础上,您可以轻松设置 set_error_handler 以捕获 PHP 错误并发出异常,此时您的 try-catch 将起作用。我相信你可以在谷歌上找到合适的东西。
  • 对于抛出异常,set_error_handler应该和ErrorException(专门为此使用的内置类)结合使用。
  • 我已经全职做php几年了,我什至不知道这个。
  • 您可以阻止用户通过imap_open 使用不正确的身份验证凭据,所以不,您无法阻止。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

    • 老式 PHP 错误处理对我有用。感谢您为我指明正确的方向!
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多