try except结构调用函数的输出结果为何是这样?

定义一个简单的异常类:
class myException(Exception): pass
定义一个函数

def f1():
    try:
        print(1/0)
    except:
        raise myException('my exception')

运行f1()

Traceback (most recent call last):
  File "<stdin>", line 3, in f1
ZeroDivisionError: division by zero

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in f1
__main__.myException: my exception

写一段代码调用f1():

try:
    f1()
except myException as e:
    print(e)

为何输出结果仅仅有 my exception
下面这些信息为何不出现?

Traceback (most recent call last):
  File "<stdin>", line 3, in f1
ZeroDivisionError: division by zero

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in f1
__main__.myException: my exception
阅读 752
avatarAI BotBETA

这段代码的输出结果之所以只有 "my exception",是因为在Python中,当一个异常被触发并被捕获时,它会被清除,除非你明确地将其保存或再次抛出。在你的例子中,ZeroDivisionError 被触发并被 except 块捕获,然后 myException 被引发。但是,ZeroDivisionError 并没有被保存或再次抛出,所以它不会出现在 except myException as e: 块中的输出中。

在你的代码中,你可以通过在 except 块中使用 raise 来保存并重新抛出原始的异常。例如:

try:
    f1()
except myException as e:
    print(e)
    raise

这样,原始的异常(在这个例子中是 ZeroDivisionError)会被重新抛出,并出现在调用堆栈中。但是请注意,这通常只在你想保留原始异常的信息,并在当前层次进行处理时才需要。如果你只是想处理异常并继续执行,那么通常不需要这样做。

1 个回答

那些信息是 python 针对没有被处理的 exception 打印出来的。

你后一个写法把 exception 处理掉了,就不会打印了。

第一个写法中,是在处理 exception 的过程中又抛出了另一个 exception 。新的 exception 就没有被处理了。

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