Python脚本在try-except块中退出并返回退出代码255

3
我正在为我的脚本添加异常处理,然后将其发送给用户进行试用。为了实现这一目标,我尝试运行try-except块来捕获我认为可能发生错误的地方。
例如,代码使用API与另一个软件进行交互。该软件依赖于硬件许可证(USB加密狗)安装在计算机上,否则Python无法访问该软件,脚本会以退出代码255退出,下面是代码示例。
    code-to-activate-licence
except Exception as e:
     warn-user-of-error

我认为try-except块应该捕获退出代码并执行except部分的代码。然而,我猜测由于尝试激活许可证似乎没有引发错误,而是给出了一个非零的退出代码,因此似乎没有被try-except块捕获。有没有办法在实际退出脚本之前捕获这个退出代码?


代码似乎崩溃了。 - CristiFati
1
根据异常层次结构,也许尝试捕获SystemExit - brunns
@GiraffeMan91 我是通过导入的库与它进行交互。根据您下面的建议,我尝试指定 SystemExit 而不是 Exception,但结果相同(脚本以退出码 255 退出)。 - Quernon
当然可以,但这很难理解。我正在使用DigSILENT PowerFactory的Python API。导致错误的调用来自powerfactory模块,即powerfactory.GetApplication()。 - Quernon
我已经联系了库提供商,他们确认在出现问题时,没有办法将激活尝试包装在try循环中而不抛出错误。问题出在库上,而不是我尝试实现的代码上。 - Quernon
显示剩余2条评论
1个回答

2
你正在使用 except Exception as e:,但是该库调用了 sys.exit(),这会引发一个类型为 BaseExceptionSystemExit,而不是标准的 ExceptionException 包含所有非系统退出异常。
你需要显式捕获 SystemExit 以便中断它。
[文档]中可以看到:

exception SystemExit

sys.exit() 函数引发此异常。它继承自 BaseException 而不是 Exception,以便不会被意外捕获 Exception 的代码捕获。

exception Exception

所有内置的、非系统退出的异常都派生自此类。所有用户定义的异常也应该派生自此类。

在代码中,它看起来像这样:
try:
    somecode()
except Exception as e:
    do_something_with_exception(e)
except SystemExit as x:
    do_something_not_exit(x)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接