在析构函数方法中抛出异常
Throwing an exception in destructor method
我找不到可靠的来源来确保我能够在 __destruct()
.
中抛出异常
这就是 php 文档所说的
Attempting to throw an exception from a destructor (called in the time of script termination) causes a fatal error.
但是当我测试它时
class A
{
public function __destruct()
{
throw new \Exception();
}
}
try {
$a = new A();
} catch(\Exception $x) {
var_dump($x);
}
看来这不是真的。我通常抛出并捕获异常。那么,为什么医生有这条线?
在 Mark Baker 的回答后编辑:
它确实有效,可以从析构函数中抛出和捕获异常。我仍然不确定为什么文档会这样。
您的脚本中的任何地方都没有调用析构函数,因此您的 try/catch 块不会捕获任何内容。如果您在 try/catch 块内 unset($x)
,则会抛出异常,并及时捕获。
class A {
public function __destruct() {
throw new \Exception();
}
}
try {
$a = new A();
unset($a);
} catch(\Exception $x) {
var_dump($x);
}
否则,PHP 会在脚本终止时抛出异常,但这在您的 try/catch 块之外
编辑
如果您的对象未被手动销毁,脚本终止时抛出的异常将无法捕获,因为您无法将 try/catch 包装在 PHP 的销毁内部终止处理中物体;这就是导致致命错误的原因
Fatal Error: Uncaught Exception
这就是文档警告您的内容
我找不到可靠的来源来确保我能够在 __destruct()
.
这就是 php 文档所说的
Attempting to throw an exception from a destructor (called in the time of script termination) causes a fatal error.
但是当我测试它时
class A
{
public function __destruct()
{
throw new \Exception();
}
}
try {
$a = new A();
} catch(\Exception $x) {
var_dump($x);
}
看来这不是真的。我通常抛出并捕获异常。那么,为什么医生有这条线?
在 Mark Baker 的回答后编辑:
它确实有效,可以从析构函数中抛出和捕获异常。我仍然不确定为什么文档会这样。
您的脚本中的任何地方都没有调用析构函数,因此您的 try/catch 块不会捕获任何内容。如果您在 try/catch 块内 unset($x)
,则会抛出异常,并及时捕获。
class A {
public function __destruct() {
throw new \Exception();
}
}
try {
$a = new A();
unset($a);
} catch(\Exception $x) {
var_dump($x);
}
否则,PHP 会在脚本终止时抛出异常,但这在您的 try/catch 块之外
编辑
如果您的对象未被手动销毁,脚本终止时抛出的异常将无法捕获,因为您无法将 try/catch 包装在 PHP 的销毁内部终止处理中物体;这就是导致致命错误的原因
Fatal Error: Uncaught Exception
这就是文档警告您的内容