我在一个不同的函数中调用了一个函数。在嵌套函数中,各种错误(例如,不正确的参数,缺少参数等)应导致退出状态1.类似于:
if not os.path.isdir(filepath):
print('Error: could not find source directory...')
sys.exit(1)
这是在python中使用退出状态的正确方法吗?相反,我应该
return sys.exit(1)
???重要的是,一旦嵌套函数完成,我将如何在另一个函数中引用此嵌套函数的退出状态?
答案 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,您仍然无法保证能够访问那里的目录!原因是有些事情可能会让你脚下的事情发生变化,通常是恶意攻击者,或者更简单的说,你根本就没有权利访问它。如果您在意,您应该只是打开目录并处理相应的错误,而不是提前尝试确定将来的某些内容是否会失败。这通常是一种更好的方法,因为"正常"代码不会因此类检查而变得混乱,除非发生错误,否则您也不会支付任何小的性能损失。