如何在 Python 3 中打印异常?

新手上路,请多包涵

现在,我在 except Exception: 子句中捕获异常,然后执行 print(exception) 。结果不提供任何信息,因为它总是打印 <class 'Exception'> 。我知道这曾经在 python 2 中工作,但我如何在 python3 中做到这一点?

原文由 Haonan Chen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 563
2 个回答

我猜您需要将 Exception 分配给一个变量。如 Python 3 教程中所示

 def fails():
    x = 1 / 0

try:
    fails()
except Exception as ex:
    print(ex)

简单说明一下, as 是一个伪赋值关键字,用在某些复合语句中,将前面的语句赋值或别名给一个变量。

在这种情况下, as 将捕获的异常分配给一个变量,允许存储有关异常的信息并在以后使用,而不是需要立即处理。

(这在 Python 3 语言参考中有详细讨论: try 语句。)


还有其他使用 as 的复合语句。第一个是 with 声明:

 @contextmanager
def opening(filename):
    f = open(filename)
    try:
        yield f
    finally:
        f.close()

with opening(filename) as f:
    # ...read data from f...

此处, with 语句用于使用 上下文管理器 定义的方法包装块的执行。这个函数就像一个扩展的 try...except...finally 语句在一个整洁的生成器包中,而 as 语句将生成器产生的结果从上下文管理器分配给一个变量以供扩展使用。

(这在 Python 3 语言参考中有详细讨论: with 语句。)


从 Python 3.10 开始, match 语句也使用 as

 from random import randint

match randint(0, 2):
    case 0|1 as low:
        print(f"{low} is a low number")
    case _:
        print("not a low number")

match 语句采用表达式(在本例中为 randint(0, 2) )并将其值与每个 case 分支进行比较,直到其中一个成功点它执行那个分支的块。在 case 分支中, as 可用于将分支的值分配给变量(如果该分支成功)。如果不成功,则不受约束。

(本 教程 涵盖了 match 语句,并在 Python 3 语言参考中进行了详细讨论: match 语句。)


最后,导入模块时可以使用 as 将模块别名为不同的(通常较短的)名称:

 import foo.bar.baz as fbb

这在 Python 3 语言参考中有详细讨论: import 语句

原文由 Noah Bogart 发布,翻译遵循 CC BY-SA 4.0 许可协议

这些是自 python 2 以来的变化:

     try:
        1 / 0
    except Exception as e: # (as opposed to except Exception, e:)
                           # ^ that will just look for two classes, Exception and e
        # for the repr
        print(repr(e))
        # for just the message, or str(e), since print calls str under the hood
        print(e)
        # the arguments that the exception has been called with.
        # the first one is usually the message. (OSError is different, though)
        print(e.args)

您可以查看标准库模块 回溯 以获得更高级的东西。

原文由 rigel 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题