【问题标题】:Exceptions are not recognised as a class and are not caught [duplicate]异常不被识别为一个类并且不被捕获[重复]
【发布时间】:2019-06-12 20:36:23
【问题描述】:

我是 PHP 编程的新手,我正在尝试在我的代码中实现一些非常基本的异常处理。但是,似乎“异常”根本没有被识别为一个类,因此没有捕获到异常。

这是一个基本的代码示例,对我不起作用:

<?php
try
{
    $x = 0; 
    $y = 1;

    $z = $y / $x;
}
catch (Exception $e)
{ 
    echo "Hello World!"; 
}
?>

当我运行此代码时,我收到以下消息,而不是预期的“Hello World!”:

警告:第 7 行 C:\myFolder\testCase.php 中除以零

到目前为止我尝试了什么:

  • 使用“\Exception”而不是“Exception”进入通用命名空间并可能在那里找到类

  • 通过在代码开头写use Exception或类似的表达式使命名空间为人所知

  • 使用各种其他类名而不是“Exception”(例如 ErrorException、Error、Throwable、DivisionByZeroError ...不记得我尝试过的所有内容)

如果我使用“throw”关键字,它会跳转到 catch 块就好了。但它应该会自动捕获除零之类的异常,而无需我抛出一个,对吗?至少这是我通过搜索网络收集到的信息(其他编程语言也是如此)。

我也考虑过使用set_exception_handler,但我不知道如何通过这种方式获取特定的异常信息,因为我不能使用Exception-&gt;getMessage()。唯一的方法是 - 再次 - 手动抛出每个异常。

我必须做什么才能让 catch 块捕获所有抛出的异常?

如果重要的话:我使用的是 PHP 7.3.0 版。

【问题讨论】:

  • 这似乎是VuoriLiikaluoma建议的唯一方法,除非你手动检查$x,顺便说一句,DivisionByZeroError只有在你模块时才会被抛出,例如$x % $ b.
  • @aynber 我之前发现了这个问题,并认为它比我想的要深入得多。如果我弄错了 try-catch 在 PHP 中的工作方式,可能仍然是重复的。我来自 C#/.NET 背景,catch 基本上可以捕获发生的每个异常,而无需抛出它们。我想要 PHP 类似的东西,并认为我做错了。那么我是否可以假设catch 只捕获手动抛出的异常而没有捕获一般异常?
  • 不,它会捕获所有异常。但是,您收到的错误是警告,而不是异常。这是不同级别的错误。
  • @aynber 知道了。我还需要使用关键字Error,我不知道它存在,因为它没有为我突出显示。在这种情况下,它确实是重复的。不过,非常感谢您的帮助!

标签: php exception


【解决方案1】:

您需要使用set_error_handler 来捕获错误/警告/通知等...

这是一个例子:

// PHP Errors to Exceptions.
set_error_handler(function (
          $err_severity,
          $err_msg,
          $err_file,
          $err_line,
    array $err_context
) {
    // error was suppressed with the @-operator
    if (0 === error_reporting()) {
        return false;
    }
    switch ($err_severity) {
        case E_WARNING:
            throw new Exception(
                $err_msg,
                0,
                $err_severity,
                $err_file,
                $err_line
            );
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-01
    • 2010-10-14
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    相关资源
    最近更新 更多