【问题标题】:Exception handling in PHP: where does $e goes?PHP 中的异常处理:$e 去哪儿了?
【发布时间】:2010-10-31 17:30:45
【问题描述】:

我一直在寻找这个,我似乎只是在这段代码中遇到了相同的文章:

   try
    {
        //some code

    }
    catch(Exception $e){
        throw $e;
    }

$e 存储在哪里或网站管理员如何查看它?我应该寻找一个特殊的功能吗?

【问题讨论】:

    标签: php exception


    【解决方案1】:

    从 catch{} 块内抛出的 Exception object(在本例中为 $e)将被下一个最高的 try{} catch{} 块捕获。

    这是一个愚蠢的例子:

    try {
        try {
            throw new Exception("This is thrown from the inner exception handler.");
        }catch(Exception $e) {
            throw $e;
        }
    }catch(Exception $e) {
        die("I'm the outer exception handler (" . $e->getMessage() . ")<br />");
    }
    

    上面的输出是

    我是外部异常处理程序(这是从内部异常处理程序抛出的。)

    【讨论】:

    • 谢谢马克,请原谅我的新手,但我如何检查 getMessage 以便查看出现了什么错误?
    • $e->getMessage() 只是一个返回带有错误消息的字符串的函数。此处的示例 #1 (php.net/manual/en/language.exceptions.extending.php) 提供了一些关于标准异常对象中可用方法的有用信息。
    【解决方案2】:

    一个好处是 Exception 实现了 __toString() 并输出了一个调用堆栈跟踪。

    所以有时在我知道的低级异常中我会想看看我是怎么做到的,在 catch() 中我只是这样做

    error_log($e);
    

    【讨论】:

    • 谢谢你,文档没有显示将异常对象传递给 error_log()。我以为我正在寻找渴望这个功能的方法。通过默认处理程序捕获、处理并记录它,在您尝试找到它之前似乎并不难。
    • 不客气。我基本上偶然发现了 Exception 的 __toString() 实现的堆栈跟踪方面,并用它来替换我们正在使用的旧函数。
    【解决方案3】:

    $eException 或从Exception 扩展的任何其他类的实例。这些对象有一些共同的特定属性和方法(继承自 Exception 类)您可以使用。有关详细信息,请参阅 chapter about exceptionsException member list

    【讨论】:

      【解决方案4】:

      我假设您使用某种第三方代码/库,其中包含此代码,这会将异常抛出到您的代码中。您只需准备好抛出异常即可捕获它,然后您可以根据需要记录/显示它。

      try {
        $Library->procedure();
      catch(Exception $e) {
        echo $e->getMessage(); //would echo the exception message.
      }
      

      如需了解更多信息,请阅读 PHP 手册中Exceptions 上的条目。

      【讨论】:

        【解决方案5】:

        线条:

        catch(Exception $e){
          throw $e;
        }
        

        没有意义。当您捕获异常时,您应该对异常执行以下操作:

        catch(Exception $e){
          error_log($e->getMessage());
          die('An error has occurred');
        }
        

        但在您的情况下,异常被直接抛出到已经发生的外部尝试块。
        如果您将代码更改为:

        //some code
        

        会产生完全相同的行为。

        【讨论】:

        • 是的!我讨厌看到异常被捕获并且只重新抛出的代码。异常处理没有得到应有的重视,导致在大型系统中随机错误处理而不是干净的代码,并且易于诊断问题。
        猜你喜欢
        • 2018-06-01
        • 2011-01-26
        • 1970-01-01
        • 2011-03-03
        • 2014-03-15
        • 2015-07-17
        • 2012-10-30
        • 2013-05-23
        • 1970-01-01
        相关资源
        最近更新 更多