【问题标题】:Python script exits with exit code 255 despite try-except block尽管有 try-except 块,Python 脚本仍以退出代码 255 退出
【发布时间】:2019-04-30 15:53:04
【问题描述】:

我正在尝试在我的脚本中构建一些异常处理,然后再将其发送给用户试用。为了实现这一点,我尝试运行 try-except 块来捕获我认为可能发生的错误。

例如,代码使用 API 与另一款软件进行交互。该软件依赖于安装在计算机中的硬件许可证(USB 加密狗),否则 Python 无法访问该软件,脚本以 Exit Code 255 退出。代码示例如下。

    code-to-activate-licence
except Exception as e:
     warn-user-of-error

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

【问题讨论】:

  • 您是直接与 API 交互还是要导入一些库来访问 API?
  • 好像代码崩溃了。
  • 根据exception hierarchy,也许可以尝试捕捉SystemExit
  • @GiraffeMan91 我正在通过导入的库与它进行交互。根据您在下面的建议,我尝试指定 SystemExit 而不是 Exception 但它以相同的方式结束(脚本以退出代码 255 退出)。
  • 你能告诉我你正在使用的库和函数吗?

标签: python exception try-catch


【解决方案1】:

您正在使用except Exception as e:,但是库正在调用sys.exit(),这会引发SystemExit,它的类型是BaseException,而不是标准的ExceptionException 包含所有非系统退出异常。

您需要显式捕获SystemExit 才能中断它。

来自[docs]

系统退出异常

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

异常例外

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

在代码中它看起来像:

try:
    somecode()
except Exception as e:
    do_something_with_exception(e)
except SystemExit as x:
    do_something_not_exit(x)

【讨论】:

    猜你喜欢
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多