概要
Python sys.exit()和exit引发内置异常SystemExit。
因此,它表现为try-catch的一部分,并且也输入finally。
SystemExit继承了BaseException,因此它不会被catch错误地捕获为正常异常或错误。 (您也可以自觉地catch。)
换句话说,可以认为关闭处理是在接收到上部SystemExit的地方执行的。
由于PHP的exit()是关闭过程,因此将执行析构函数和关闭函数,但不会传递finally作为异常机制。
将
和exit作为例外处理是不同的。
的PHP
您可以在
exit的说明和用户注释中找到它。
PHP:退出--Manual
示例3执行关闭功能或析构函数的示例
class Foo
{
public function __destruct()
{
echo 'Destruct: ' . __METHOD__ . '()' . PHP_EOL;
}
}
function shutdown()
{
echo 'Shutdown: ' . __FUNCTION__ . '()' . PHP_EOL;
}
$foo = new Foo();
register_shutdown_function('shutdown');
exit();
echo 'これは出力されません。';
?>
上面示例的输出如下。
Shutdown: shutdown()
Destruct: Foo::__destruct()
PHP:退出--Manual:用户贡献的注释
与finally一起使用exit的注释:如果您在try块中的某个位置退出,将不会执行finally。听起来似乎不明显:例如,在Java中,您永远不会发出exit,至少返回您的控制器;在PHP中,您可能会发现自己退出了控制器方法(例如,如果发出重定向)。
以下是POC:
echo "testing finally wit exit\n";
try {
echo "In try, exiting\n";
exit;
} catch(Exception $e) {
echo "catched\n";
} finally {
echo "in finally\n";
}
echo "In the end\n";
?>
这将打印:
测试终于退出了
在尝试中,退出
还有一种方法可以引发异常而不是
退出,并使用catch来编写终止过程,但这似乎不是一个完美的选择。
用PHP7运行它是很自然的,但是结果是一样的。
Python
Uchan注意:Python exit(),sys.exit()和os._exit()之间的区别
如果您看的话,一目了然。
除了
os._exit()之外,还会引发异常,因此finally也很重要。
当说os._exit()等同于PHP的exit()时,看起来有些不同。
exit
4.内置常量-Python 2.7.x文档
当显示
时,输出诸如"使用quit()或Ctrl-D(即EOF)退出"之类的消息,并在调用时发送带有指定退出代码的SystemExit。这是一个对象。
sys.exit()
28.1.sys —系统参数和功能— Python 2.7.x文档
退出
Python。由于exit()发送SystemExit,因此您可以在try语句的finally子句中编写终止过程,或者在更高级别捕获异常并中断exit过程。
(略)
最终,exit()只是"抛出"异常,因此从主线程调用它时,它只是终止进程而不会阻止异常。
6.内置异常-Python 2.7.x文档
sys.exit()函数引发此异常。如果未处理此异常,则Python解释器将退出而不在堆栈上显示任何回溯。如果关联值是规则整数,则表示系统退出状态(传递给exit()函数)。如果值为None,则退出状态为0。对于其他类型(例如字符串),将显示该对象的值,并且退出状态为1。
此异常的实例具有属性代码。此值设置为退出状态或错误消息(默认为无)。同样,此异常严格来说也不是错误,因此它是从BaseException而不是StandardError派生的。
sys.exit()允许执行清理过程(try语句的finally子句),并允许执行脚本而不会冒调试器失控的风险。当您确实需要立即退出时(例如,在调用fork()之后的子进程中),可以使用os._exit()函数。
此异常继承自BaseException,而不是StandardError或Exception继承,因此,捕获异常的代码不会错误地捕获它。这将稳定地将此异常传播给调用者并终止解释器。
在版本2.5中更改:已更改为继承BaseException。
确实!是不是。
os._exit()
15.1。操作系统-其他操作系统接口-Python 2.7.x文档
以退出状态n退出进程。这时,不调用清除处理程序,并且不刷新标准I / O缓冲区。
相关文章
来自同一博客。
finally这是从没有时代到实现之后的时代的过渡,但是
这次结合exit的操作,我认为析构函数已被重新识别。
PHP最终没有,但是有一个析构函数:Architect Note
最后编写,析构函数编写:架构师说明
为什么PHP最终仍需要:架构师说明