当前位置: 首页 > 知识库问答 >
问题:

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

乐正晟
2023-12-29

定义一个简单的异常类:
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

共有1个答案

宗政德宇
2023-12-29

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

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

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

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

 类似资料:
  • 当我使用put操作将数据对象插入aws firhose流时,它工作正常。由于在我的fire hose流上启用了lambda函数。因此调用了lambda函数,但给了我一个输出结构响应错误: 所以现在我已经创建了我的lambda函数,这样可以做出正确的输出结构: 现在,我得到了以下关于将“数据”字段编码为 如果我将“hello”更改为b“hello”之类的字节,则会出现以下错误:

  • 本章节我们主要结合前面所学的知识点来介绍Python数据结构。 列表 Python中列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表可以修改,而字符串和元组不能。 以下是 Python 中列表的方法: 方法 描述 list.append(x) 把一个元素添加到列表的结尾,相当于 a[len(a):] = [x]。 list.extend(L) 通过添加指定列表的所有元素来扩

  • 本文向大家介绍根据下面代码:说出执行结果,并解释为何是会是这样的结果?相关面试题,主要包含被问及根据下面代码:说出执行结果,并解释为何是会是这样的结果?时的应答技巧和注意事项,需要的朋友参考一下 1:输出b 2:输出undefined,楼上已经有答案了,Number类型是不可迭代的类型,这点可以从 Number类型的数据是不存在length这个方法验证,既然length都没有,那答案就显而易见了。

  • 问题内容: 对于以下C代码: 对于Win32,我得到以下反汇编: 对于Linux32: 我试图了解呼叫后呼叫者的行为方式的差异。为什么Linux32中的调用程序会执行这些额外的操作? 我假设两个目标都将遵循cdecl调用约定。cdecl不会为返回结构的函数定义调用约定吗? 编辑: 我添加了被调用者的实现。可以肯定的是,您可以看到Linux32被调用方会弹出其参数,而Win32被调用方不会: Win

  • 问题内容: 对此有些困惑。请看游乐场。 我希望go允许您调用一个方法,该方法将一个父级与嵌入该父级的子级一起使用。 如果我使用“ child.Parent”来调用它,那么它可以工作,但是在那种情况下,我不能在函数中使用任何将值用作空接口的代码。对此进行了Google搜索,发现了一个非常有趣且有用的页面。 从OOP的角度看Golang的概念。欢迎就我在这里缺少的内容提供任何指导。也许这只是我在这里没

  • 我的ts文件中有一个函数: 我想要的是在我的HTML中返回这个函数的结果。我可以调用html中的函数,如: 但每次单击任何位置时,它都会更改值,而我会得到一个错误: