获取嵌套函数的退出状态?

时间:2014-06-10 18:06:23

标签: python exit-code

我在一个不同的函数中调用了一个函数。在嵌套函数中,各种错误(例如,不正确的参数,缺少参数等)应导致退出状态1.类似于:

if not os.path.isdir(filepath):
    print('Error: could not find source directory...')
    sys.exit(1)

这是在python中使用退出状态的正确方法吗?相反,我应该

return sys.exit(1)

???重要的是,一旦嵌套函数完成,我将如何在另一个函数中引用此嵌套函数的退出状态?

3 个答案:

答案 0 :(得分:2)

sys.exit()提出SystemExit exception。通常,你不应该使用它,除非你真的想退出程序。

你可以抓住这个例外:

try:
    function_that_uses_sys.exit()
except SystemExit as exc:
    print exc.code

.code例外的SystemExit属性设置为建议的退出代码。

但是,您应该使用更具体的异常,或者为作业创建自定义异常。这里可能需要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)

答案 1 :(得分:0)

使用sys.exit,通常表示您希望整个程序结束。如果要在调用函数中处理错误,则应该让内部函数引发更具体的异常。 (你可以捕获SystemExit引发的异常,但是将错误信息传递出去将是一种相当尴尬的方式。)

答案 2 :(得分:0)

我想正确的做法是:

if not os.path.isdir(filepath):
    raise ValueError('the given filepath is not a directory')

然而,可以改进现有的代码。一点是文件的路径永远不应该是目录,因此这不是一个例外状态。也许你想要的只是命名它path而不添加意想不到的内涵。

此外,这具有实际的功能含义,即使isdir()返回true,您仍然无法保证能够访问那里的目录!原因是有些事情可能会让你脚下的事情发生变化,通常是恶意攻击者,或者更简单的说,你根本就没有权利访问它。如果您在意,您应该只是打开目录并处理相应的错误,而不是提前尝试确定将来的某些内容是否会失败。这通常是一种更好的方法,因为"正常"代码不会因此类检查而变得混乱,除非发生错误,否则您也不会支付任何小的性能损失。