【问题标题】:Do Python Exceptions go up the Call stack?Python 异常会进入调用堆栈吗?
【发布时间】:2017-07-26 12:45:14
【问题描述】:

在 Python 中,如果函数 A 调用函数 B,函数 B 调用函数 C,并且函数 C 抛出 ValueError(例如),错误是否会向上调用堆栈,从而函数 A 也会抛出 ValueError ?例如,我可以在函数 A 中捕获函数 C 的值错误吗?

另外,如果你自己创建一个只在函数 C 中定义的异常,它是否也会向上调用堆栈,以便函数 A 抛出相同的错误?

【问题讨论】:

  • 你试过了吗?
  • 你在这里问的是一个简单的事情,你可以自己检查。
  • 我想知道异常的概念如何在不向上传递堆栈的情况下工作。

标签: python error-handling callstack


【解决方案1】:

错误是否在调用堆栈中向上移动,因此函数 A 也会抛出 ValueError?

让我们试试看。

def a():
    try:
        b()
    except ValueError:
        print("Caught a value error in `a`.")

def b():
    c()

def c():
    raise ValueError

a()

结果:

Caught a value error in `a`.

是的,看起来错误已经进入调用堆栈。

如果您创建自己的仅在函数 C 中定义的异常,它是否也会向上调用堆栈以使函数 A 抛出相同的错误?

让我们试试看。

def a():
    try:
        b()
    except:
        print("Caught some kind of exception in `a`.")

def b():
    c()

def c():
    class MyCustomException(Exception):
        pass
    raise MyCustomException

a()

结果:

Caught some kind of exception in `a`.

是的,自定义异常也会进入调用堆栈。但是您将无法在a 中使用except MyCustomException:,因为该名称仅存在于c 中。因此,在可行的情况下,在全局范围内声明类。

【讨论】:

    猜你喜欢
    • 2011-02-06
    • 1970-01-01
    • 2011-12-24
    • 2010-11-28
    • 2013-03-31
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    相关资源
    最近更新 更多