提问人:kael 提问时间:10/16/2016 更新时间:10/16/2016 访问量:24
未在对象方法中捕获异常
Exception not being caught inside object method
问:
这更像是文档,因为我已经解决了这个问题,但它很微妙,调试起来很困难,我认为它在公共领域很有用。
问题是我在对象方法中有一个 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......
正如你所看到的,例外没有被抓住。我尝试了各种各样的方法,就是想不通为什么没有被抓住。然后。。。。(见下文)
答:
0赞
kael
10/16/2016
#1
我意识到这是一个命名空间问题。因为我在命名空间中声明了,并且在全局命名空间中,所以我对 within 类方法的引用是默认解析的,因此与抛出的实际异常不匹配。而且由于我实际上并没有尝试从命名空间中实例化异常,因此没有出现“未知类”错误来揭示正在发生的事情。TestClass
MyTest
throwTestException
Exception
\MyTest\Exception
\RuntimeException
因此,解决方案只是正确解决我试图捕获的异常类:
catch(\Exception $e) { .... }
公平地说,当我构建高度简化的示例时,这一点变得很明显。最初并不明显,因为我期望捕获的异常是由类的超类(即 SQLite3 类)生成的。因此,在生成异常时,我不必担心命名空间,在捕获它时,我所考虑的只是使用最通用的异常形式。再说一次,由于我没有实例化该异常 - 只是在块中与它匹配--,因此我没有收到任何未解决的通知。Exception
catch
评论