![](/img/trans.png)
[英]How to catch an exception that was already caught by a nested function call in Python
[英]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_function
的except
的方法,以便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_function
在try
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'
并按照这个顺序,错误处理链在整个程序中被跟踪,并在任何可以处理的地方进行处理
最佳实践是尽可能少地将语句保留在try
和except
中,以免通过它们也遇到异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.