繁体   English   中英

捕获已捕获的异常

[英]Catch an already caught exception

我有一个函数,它既应该独立运行,又应该由处理某些异常的其他函数使用

def some_function():
    try:
        do_something()
    except SpecificException:
        handle_exception()

我有第二个函数调用第一个函数,但希望在some_function发生时以不同的方式处理此异常:

def different_function():
    try:
        some_function()
    except SpecificException:
        different_handling()

这是可能吗? 我正在寻找的是一种禁用some_functionexcept的方法,以便different_function中的 try-except 可以捕获SpecificException

告诉函数some_function不处理异常并将其传递

def some_function(handleException=True):
    try:
        do_something()
    except SpecificException:
        if !handleException: raise
        handle_exception()

def different_function():
    try:
        some_function(handleException=False)
    except SpecificException:
        different_handling()

或者为函数some_function要使用的异常处理程序

def some_function(exceptionHandler=handle_exception):
    try:
        do_something()
    except SpecificException:
        exceptionHandler()

def different_function():
    some_function(exceptionHandler=different_handling)

在第一个函数中执行所需的逻辑后,您可以再次重新引发异常。

def some_function():
    try:
        do_something()
    except SpecificException as e:
        handle_exception()
        raise e 

你可以用raise语句重新raise

def some_function():
    try:
        do_something()
    except SpecificException:
        handle_exception()
        raise

正如文档所说: If no expressions are present, raise re-raises the last exception that was active in the current scope.

我无法准确理解您想说的内容,但是如果您在第一个函数中处理特定异常,则您在第二个函数中编写的异常将不起作用。 如果这两个异常彼此不同,例如 FileNotFoundException 和 IOException 将改变情况。 在这种情况下,无论代码给出哪个错误,与之相关的部分都将起作用。 如果问题与此不同,您可以稍微打开问题吗?

这完全取决于您如何处理第一个功能。 如果您的第一个函数接受错误并处理它,那么第二个函数将找不到任何错误,因此它将执行。

但是如果你的第一个函数无法处理错误,(假设你的第一个函数处理 error_type1,但在运行时它引发了 error_type2),那么第一个函数的异常显然会失败,如果该错误在第二个函数中得到正确处理,那么没关系。

我的意思是,如果第一个函数以某种方式引发错误,那么第二个函数会捕获它,否则不会,就这么简单。 现在,如果您希望在第二个函数中捕获相同的错误,只需在第一个异常中引发错误即可。

您的示例是合法的,但让我们将其拆分为几个常见案例,以查看我将提供的示例:

def some_function():
    try:
        a = int("a")
    except ValueError:
        print("not convertable")        

def different_function():
    try:
        some_function()
    except Exception as e:
        print(e)

different_function()

输出:

not convertable

发生了什么?

函数different_functiontry catch语句中调用了some_function ,内部函数现在遇到了在它自己的try catch语句中引发Exception的行,并处理它。 现在 - 异常从未重新引发到外部函数,该函数保持运行而不会遇到错误。

这是一个例子,当内部函数知道如何处理异常时。

有时,在现实生活中,内部函数不知道如何自己处理异常,然后向上重新引发异常,如下所示:

def some_function():
    try:
        a = int("a")
    except ValueError as e:
        raise e
        

def different_function():
    try:
        some_function()
    except Exception as e:
        print("I Know how to fix it: " + str(e))

different_function()

输出:

I Know how to fix it: invalid literal for int() with base 10: 'a'

并按照这个顺序,错误处理链在整个程序中被跟踪,并在任何可以处理的地方进行处理

最佳实践是尽可能少地将语句保留在tryexcept中,以免通过它们也遇到异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM