【问题标题】:Try/Blocks exceptions in a called function在被调用函数中尝试/阻止异常
【发布时间】:2017-05-10 16:28:56
【问题描述】:

我有一些在链中调用的函数,我需要在这些函数上引入 try/except 块来处理我正在使用的库引起的异常。

我试图了解这是否安全,更具体地说,如果我们总能期望 try/except 块在执行流程中看不到更深的 try/except 块:

def level_two_function():

    try:
        return a[i]
    except:
        return "Exception at level 2"

def level_one_function():

    try:
        return level_two_function()
    except:
        return "Exception at level 1"

level_one_function() # 'Exception at level 2'

level_one_function 的 try/except 块在任何情况下都见过level_two_function 引发的任何异常吗?

与以下情况相比,行为如何?

def work(token, restrictions):

    def loop(token):
        if token.text in restrictions:
            try:
                return loop(token.nbor())
            except IndexError:
                return token
        else:
            return token

    try:
        start = token.nbor()
        return loop(start)
    except IndexError:
        #  if it has no neighbor just return it
        return token

【问题讨论】:

  • 这里没有递归;这些函数中的任何一个都不会在任何地方调用自身。然而,并不是说递归调用的答案会有所不同。
  • 我知道,我只是提供一个嵌套级别的示例。那么返回异常只适用于递归调用?
  • 不,调用是否递归无关紧要。

标签: python recursion exception-handling


【解决方案1】:

如果在 return "Exception at level 2" 行中引发了异常,您的 level_one_function() 仍然可以看到在 level_two_function 期间引发的异常。

如果内存不足或发送了键盘中断,该行可能会引发异常。

但是,level_two_function()try:..except 块中引发的任何异常都将由该块处理,并且不会向上传播调用堆栈。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 2019-01-06
    相关资源
    最近更新 更多