在线阅读有些程序员使用sys.exit
,有些则使用SystemExit
。
对不起,基本问题是:
示例
ref = osgeo.ogr.Open(reference)
if ref is None:
raise SystemExit('Unable to open %s' % reference)
或者
ref = osgeo.ogr.Open(reference)
if ref is None:
print('Unable to open %s' % reference)
sys.exit(-1)
sys.exit(s)
只是raise SystemExit(s)
的简写,如前者的docstring中所述;请尝试help(sys.exit)
。因此,您可以不使用任何一个示例程序除了提升
SystemExit
之外,还有3个退出函数。底层的是
os._exit
,它需要1个int参数,并且不需要清除就立即退出。你不太可能想碰这个,但它就在那儿。sys.exit
是在sysmodule.c中定义的,只运行PyErr_SetObject(PyExc_SystemExit, exit_code);
,这实际上等同于直接提升SystemExit
。详细地说,提高SystemExit
可能更快,因为sys.exit
需要LOAD_ATTR
和CALL_FUNCTION
对RAISE_VARARGS
操作调用。另外,raise SystemExit
生成的字节码稍小(少了4字节),(如果使用from sys import exit
则额外生成1字节,因为sys.exit
预期返回None,因此包含一个额外的POP_TOP
)。最后一个exit函数在
site.py
中定义,并在REPL中别名为exit
或quit
。它实际上是Quitter
类的一个实例(因此它可以有一个自定义的__repr__
,因此可能是运行最慢的。另外,它在提升SystemExit
之前关闭sys.stdin
,因此建议仅在REPL中使用。至于
SystemExit
是如何处理的,它最终会导致VM调用os.\u exit,但在此之前,它会进行一些清理。它还运行atexit._run_exitfuncs()
,运行通过atexit
模块注册的任何回调。调用os._exit
直接绕过atexit
步骤。没有实际的区别,但是在您的示例代码中还有另一个区别-
print
转到标准输出,但是异常文本转到标准错误(这可能是您想要的)。相关问题 更多 >
编程相关推荐