现在,我在 except Exception:
子句中捕获异常,然后执行 print(exception)
。结果不提供任何信息,因为它总是打印 <class 'Exception'>
。我知道这曾经在 python 2 中工作,但我如何在 python3 中做到这一点?
原文由 Haonan Chen 发布,翻译遵循 CC BY-SA 4.0 许可协议
现在,我在 except Exception:
子句中捕获异常,然后执行 print(exception)
。结果不提供任何信息,因为它总是打印 <class 'Exception'>
。我知道这曾经在 python 2 中工作,但我如何在 python3 中做到这一点?
原文由 Haonan Chen 发布,翻译遵循 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 许可协议
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
1 回答2.9k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.5k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
我猜您需要将
Exception
分配给一个变量。如 Python 3 教程中所示:简单说明一下,
as
是一个伪赋值关键字,用在某些复合语句中,将前面的语句赋值或别名给一个变量。在这种情况下,
as
将捕获的异常分配给一个变量,允许存储有关异常的信息并在以后使用,而不是需要立即处理。(这在 Python 3 语言参考中有详细讨论:
try
语句。)还有其他使用
as
的复合语句。第一个是with
声明:此处,
with
语句用于使用 上下文管理器 定义的方法包装块的执行。这个函数就像一个扩展的try...except...finally
语句在一个整洁的生成器包中,而as
语句将生成器产生的结果从上下文管理器分配给一个变量以供扩展使用。(这在 Python 3 语言参考中有详细讨论:
with
语句。)从 Python 3.10 开始,
match
语句也使用as
:match
语句采用表达式(在本例中为randint(0, 2)
)并将其值与每个case
分支进行比较,直到其中一个成功点它执行那个分支的块。在case
分支中,as
可用于将分支的值分配给变量(如果该分支成功)。如果不成功,则不受约束。(本 教程 涵盖了
match
语句,并在 Python 3 语言参考中进行了详细讨论:match
语句。)最后,导入模块时可以使用
as
将模块别名为不同的(通常较短的)名称:这在 Python 3 语言参考中有详细讨论:
import
语句。