Python 使用两个函数引发异常未按预期捕获异常

Python 使用两个函数引发异常未按预期捕获异常,python,exception,raiserror,Python,Exception,Raiserror,代码如下: def funcFail(): 尝试: 引发异常(“外部失败”) 打印(“不应打印”) 例外情况除外,如e: 打印(f“异常:{e}”) 引发异常(f“由于{e}发生的异常”) 最后: return“这是最后一个block:P” 打印(“这是最后一个块:P”) def CHECKEXCEP(): 全局k k=[] 尝试: funcFail() 例外情况除外,如e: 打印(f“异常输出:{e}”) k、 附加(str(e)) 最后: 返回“无” checkexpcep() 期望值:

代码如下:

def funcFail():
尝试:
引发异常(“外部失败”)
打印(“不应打印”)
例外情况除外,如e:
打印(f“异常:{e}”)
引发异常(f“由于{e}发生的异常”)
最后:
return“这是最后一个block:P”
打印(“这是最后一个块:P”)
def CHECKEXCEP():
全局k
k=[]
尝试:
funcFail()
例外情况除外,如e:
打印(f“异常输出:{e}”)
k、 附加(str(e))
最后:
返回“无”
checkexpcep()
期望值:

"Exception : Failed externally"
"This is finally block :P"
"Exception out : Exception in occured due: Failed externally"
"Exception : Failed externally"
输出:

"Exception : Failed externally"
"This is finally block :P"
"Exception out : Exception in occured due: Failed externally"
"Exception : Failed externally"

下次尝试使用python调试器(任何ide都足够好,pycharm或wing等等)。无论如何,请在下面的代码中查看我的内联注释编号:

def funcFail():
    try:
        # (2)
        raise Exception("Failed externally")
        print("Should not print")
    except Exception as e:
        print(f"Exception : {e}")
        # (3)
        raise Exception(f"Exception in occured due: {e}")   
    finally:
        # (4)
        return "This is finally block :P"
        print("This is finally block :P")

def checkexpcep():
    global k 
    k = []
    try:
        # (1)
        funcFail()
        # (5)
    except Exception as e:
        print(f"Exception out : {e}")
        k.append(str(e))
    finally:
        return "nothing"

checkexpcep()

调用
checkexpcep()
后,您将到达代码中的点
1
。然后调用
funcFail()
并到达点
2
,在
2
处引发一个异常,该异常由except块调用,并到达点
3
,在打印该异常后,在点
3
处引发新异常,然后到达
finally
块,python执行它(注意,finally总是执行)。您将从finally block返回,返回字符串为
“This is finally block:P”
。这将隐藏以前的异常。返回将带您进入点
5
。返回值未做任何处理,程序成功完成。

如果您确实想要预期的输出,则只需将
返回值
移出
最终
块:

def funcFail():
尝试:
引发异常(“外部失败”)
打印(“不应打印”)
例外情况除外,如e:
打印(f“异常:{e}”)
引发异常(f“由于{e}发生异常”)
最后:
打印(“这是最后一个块:P”)
return“这是最后一个block:P”
def CHECKEXCEP():
全局k
k=[]
尝试:
funcFail()
例外情况除外,如e:
打印(f“异常输出:{e}”)
k、 附加(str(e))
最后:
返回k,“无”
打印(checkexpcep())
输出:

Exception : Failed externally
This is finally block :P
Exception out : Exception in occurred due: Failed externally
(['Exception in occurred due: Failed externally'], 'nothing')

(注意,我在末尾添加了一个
元组的打印,以显示
k
的值)

显然
返回
最后
异常中。@quamrana,有没有其他选择,或者我应该不使用finally继续?我还建议使用自定义异常,可能会使这样的代码更容易调试:您应该使用
finally
,以便整理是否存在异常。只有在没有例外的情况下,当您想要返回某个内容时才使用
return
,因此
return
finally
中似乎不合适。