Python 捕获已捕获的异常

Python 捕获已捕获的异常,python,python-3.x,Python,Python 3.x,我有一个函数,它既可以独立运行,也可以被处理某些异常的其他函数使用 def some_function(): try: do_something() except SpecificException: handle_exception() 我还有第二个函数,它调用第一个函数,但希望在某个函数中发生异常时以不同的方式处理该异常: def different_function(): try: some_function()

我有一个函数,它既可以独立运行,也可以被处理某些异常的其他函数使用

def some_function():
    try:
        do_something()
    except SpecificException:
        handle_exception()
我还有第二个函数,它调用第一个函数,但希望在
某个函数中发生异常时以不同的方式处理该异常:

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

这有可能吗?我正在寻找的是一种禁用
some_函数中的
except
的方法,这样try-except-in
different_函数
可以捕获
特定异常

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

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

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

告诉函数
some_函数
不要处理异常并传递它

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\u函数
提供要使用的异常处理程序

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

def different_function():
    some_function(exceptionHandler=different_handling)

这完全取决于您如何处理第一个函数。如果第一个函数接受错误并进行处理,那么第二个函数将不会发现任何错误,因此它将执行

但是如果您的第一个函数不能处理该错误(假设您的第一个函数处理错误类型1,但在运行时它引发了错误类型2),那么第一个函数的异常将明显失败,如果在第二个函数中正确处理了该错误,则一切正常


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

您可以使用
raise
语句重新引发它

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

如上所述:
如果不存在表达式,raise将重新引发当前作用域中活动的最后一个异常

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

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
I Know how to fix it: invalid literal for int() with base 10: 'a'
发生了什么事

函数
try
catch
语句中调用的
不同的\u函数
在它自己的
try
catch
语句中遇到一行引发
异常
,并对其进行处理。 现在-异常从未重新引发到外部函数,该函数保持运行而不会遇到错误

这是一个“当内部函数知道如何处理异常时”的示例

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

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()
输出:

not convertable
I Know how to fix it: invalid literal for int() with base 10: 'a'
按照这个顺序,错误处理链在整个程序中保持跟踪,并在任何可以处理的地方进行处理


最佳做法是尽可能少地将语句保存在
try
except
中,以避免通过它们遇到异常。

两种异常都是相同的,例如FileNotFound。假设
some_function
仅在找不到文件时发出警告消息,但是
different_function
中的异常处理应创建一个新文件。如果是这样,为什么要使用两种不同的异常处理机制?你可以一次完成,除了。它可以创建警告并随后创建文件。如果要禁用某个\u函数中的异常,可以删除try except块,它将自动落入不同\u函数中的异常。因为函数具有不同的职责。例如,
某些函数
应读取一个文件(因此,当文件不存在时会引发异常),并由模块中的多个函数使用
Differentive_function
是一个特殊的用例,如果没有文件存在,我们希望创建一个新的文件。是的,这就是您要寻找的。