未在对象方法中捕获异常

Exception not being caught inside object method

提问人:kael 提问时间:10/16/2016 更新时间:10/16/2016 访问量:24

问:

这更像是文档,因为我已经解决了这个问题,但它很微妙,调试起来很困难,我认为它在公共领域很有用。

问题是我在对象方法中有一个 try/catch 块,它不起作用。简化的示例位于两个文件中,如下所示:

测试类:.php:

<?php
//TestClass.php
namespace MyTest;

class TestClass {
    public function __construct() {
        \e("Initializing object");
        try {
            \e("Trying object exception");
            \throwTestException("Failing gracefully in object");
            \e("After exception");
        } catch (Exception $e) {
            \e($e->getMessage());
        }
        \e("After object init exception");
    }
}
?>

主 .php:

<?php
//Main.php

function e($str) { echo "\n$str"; }
function throwTestException($msg) {
    throw new RuntimeException($msg);
}
require "TestClass.php";

e("Beginning");
try {
    e("First try");
    throwTestException("Failing gracefully first");
    e("After exception");
} catch (Exception $e) {
    e($e->getMessage());
}
e("Ending");

e('');

e('Beginning object test');
new \MyTest\TestClass();
e('Ending object test');
?>

加载 Main.php 的预期结果是这样的:

Beginning
First try
Failing gracefully first
Ending

Beginning object test
Initializing object
Trying object exception
Failing gracefully in object
After object init exception
Ending object test

我实际得到的是这样的:

Beginning
First try
Failing gracefully first
Ending

Beginning object test
Initializing object
Trying object exception

Fatal Error: Uncaught Exception: Failing gracefully in object......

正如你所看到的,例外没有被抓住。我尝试了各种各样的方法,就是想不通为什么没有被抓住。然后。。。。(见下文)

PHP 异常 命名空间

评论


答:

0赞 kael 10/16/2016 #1

我意识到这是一个命名空间问题。因为我在命名空间中声明了,并且在全局命名空间中,所以我对 within 类方法的引用是默认解析的,因此与抛出的实际异常不匹配。而且由于我实际上并没有尝试从命名空间中实例化异常,因此没有出现“未知类”错误来揭示正在发生的事情。TestClassMyTestthrowTestExceptionException\MyTest\Exception\RuntimeException

因此,解决方案只是正确解决我试图捕获的异常类:

catch(\Exception $e) { .... }

公平地说,当我构建高度简化的示例时,这一点变得很明显。最初并不明显,因为我期望捕获的异常是由类的超类(即 SQLite3 类)生成的。因此,在生成异常时,我不必担心命名空间,在捕获它时,我所考虑的只是使用最通用的异常形式。再说一次,由于我没有实例化该异常 - 只是在块中与它匹配--,因此我没有收到任何未解决的通知。Exceptioncatch