Python3 异常处理和捕获

Python 3 exception handling and catching

我正在为一项非常具体的任务设计工作流引擎,并且正在考虑异常处理。

我有一个调用几个函数的主进程。这些函数中的大多数调用其他更具体的函数等等。涉及几个库,因此可能会发生很多特定错误。 IOError、OSError、AuthenticationException ...

我必须在发生错误时停止工作流程并将其记录下来,以便在错误解决后我可以从那时起继续。

我的意思的例子:

def workflow_runner():
    download_file()
    ...
    (more calls with their own exceptions)
    ...


def download_file():
    ftps = open_ftp_connection()
    ftps.get(filename)
    ...
    (more calls with their own exceptions)
    ...


def open_ftp_connection():
    ftps = ftplib.FTP_TLS()
    try:
        ftps.connect(domain, port)
        ftps.login(username, password)
    except ftplib.all_errors as e:
        print(e)
        raise
    return ftps

你的基础,运行 工厂,模块化功能。

我的问题是:

在 Python 3 中进行自上而下错误处理的最佳方法是什么?

是直接完成并当场提出错误还是在 "download_file" and/or "workflow_runner" 函数中捕获它更好?

我问是因为如果我最终抓住了顶部的所有东西,我觉得我可能会得到:

except AError
except BError
...
except A4Error

这取决于... 您在可以采取措施的时候捕获到异常。这在不同的函数和不同的异常类型之间是不同的。一段代码调用子系统(一般来说是任何函数),它知道子系统可能会引发异常 ABC。它现在需要决定它期望什么异常 and/or 它可以对它们中的每一个做些什么。最后它可能决定捕获 AB 异常,但是捕获 C 异常是没有意义的,因为它对它们无能为力。现在这意味着这段代码可能会引发 C 异常,其调用者需要意识到这一点并做出相同类型的决定。

所以不同的异常在不同的层被适当地捕获。

更具体地说,假设您有一些系统,其中包含一些从远程服务器下载一些东西的 HTTP 对象,一些处理这些 HTTP 对象并将其结果存储在数据库中的作业管理器,以及一个启动和停止作业管理器的顶级协调器。当网络请求失败时,HTTP 对象显然会引发各种 HTTP 异常,而作业管理器可能会在数据库出现问题时引发异常。您可能会让工作经理担心像 404 这样的 HTTP 错误,而不是像 ComputerDoesntHaveANetworkInterface 这样的基本错误;同样 DatabaseIsUnreachable 异常是工作经理无能为力的,并且可能会导致应用程序终止。