如何获取嵌套函数的退出状态?
我有一个函数是在另一个函数里面调用的。在这个嵌套的函数里,如果出现各种错误(比如参数不对、缺少参数等等),应该返回退出状态1。就像这样:
if not os.path.isdir(filepath):
print('Error: could not find source directory...')
sys.exit(1)
这样使用退出状态在Python里对吗?我是不是应该用其他方式,比如:
return sys.exit(1)
重要的是,嵌套函数执行完后,我该如何在外面的函数里获取这个嵌套函数的退出状态呢?
3 个回答
0
我想正确的做法是这样的:
if not os.path.isdir(filepath):
raise ValueError('the given filepath is not a directory')
不过,这段代码还有改进的空间。首先,文件的路径不应该是一个目录,所以这并不是一个特殊的情况。也许你只想把它命名为 path
,而不想引入其他的含义。
更重要的是,这实际上会影响功能,即使 isdir()
返回真,你也不能保证能访问那个目录!原因是可能有一些事情在你不知情的情况下发生了,比如一个恶意攻击者,或者更简单的情况是,你可能根本没有权限去访问它。如果你在意这些问题,最好直接打开目录,然后处理相应的错误,而不是提前判断将来是否会失败。这种做法通常更好,因为“正常”的代码不会被这些检查搞得乱七八糟,除了在发生错误时,你也不会付出任何小的性能代价。
0
使用 sys.exit
的时候,通常是想告诉程序要结束了。如果你想在调用这个函数的地方处理错误,最好让里面的函数抛出一个更具体的错误信息。虽然你可以捕捉到 SystemExit 抛出的异常,但那样处理错误信息就显得有点笨拙了。
3
sys.exit()
会引发一个 SystemExit
异常。通常情况下,你 不应该使用它,除非你真的想要退出你的程序。
你可以捕捉到这个异常:
try:
function_that_uses_sys.exit()
except SystemExit as exc:
print exc.code
SystemExit
异常的 .code
属性会被设置为你想要的退出代码。
不过,实际上你应该使用一个更具体的异常,或者为这个情况创建一个自定义的异常。比如说,使用 ValueError
可能更合适:
if not os.path.isdir(filepath):
raise ValueError('Error: could not find source directory {!r}'.format(filepath))
然后捕捉 那个 异常:
try:
function_that_may_raise_valueerror()
except ValueError as exc:
print "Oops, something went wrong: {}".format(exc.message)