【问题标题】:Prevent traceback in main防止 main 中的回溯
【发布时间】:2017-07-05 21:45:43
【问题描述】:

在我的main.py 模块中,我从util.py 调用函数myFunc()。在util.py中,我处理myFunc()可能抛出的异常,并调用sys.exit(1)。但是,我仍然在我的 main.py 模块中获得了 Traceback 打印。有没有办法简单地捕获util 中的异常而不必处理main 中的任何输出,或者我在main 中捕获异常而不是在util 中更好?

def get_token(token_name):

    token_handler = Tokens(token_name)
    try:
        token = token_handler.get()
    except TokenException  as e:
        logging.error("{error}".format(error=e))
        sys.exit(1)

    return token

【问题讨论】:

  • 你能粘贴至少处理异常的代码吗?
  • @PRMoureu 已更新。
  • @NishantRoy 你能修改 util 的代码吗?
  • @cᴏʟᴅsᴘᴇᴇᴅ 是的,我可以。您是否建议从 util 中删除 try, except 并将其添加到 main 中?

标签: python logging error-handling try-except


【解决方案1】:

这是一个设计原则问题,但总体思路是只有在您知道如何处理异常时才捕获异常

吞下异常不是一个好主意,因为它会使调试变得更加困难。尤其是当您编写具有多个调用点的关键代码时。函数内部生成的异常应重新抛出/重新引发,以由调用该函数的代码处理。

例如,您可以考虑像这样修改utils.py

def get_token(token_name):
    token_handler = Tokens(token_name)
    try:
        token = token_handler.get()
    except TokenException  as e:
        # write to some log file if needed
        raise e

    return token

同样,您的 main.py 看起来像这样:

try:
    token = get_token(token_name)
except TokenException:
    ... # handle TokenException
except Exception:
    ... # handle any other Exception

这肯定会使代码更加健壮,因为您作为调用者可以控制您调用的函数。

【讨论】:

    猜你喜欢
    • 2020-04-28
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多