【问题标题】:Python 3 exception handling and catchingPython 3 异常处理和捕获
【发布时间】:2018-01-31 13:27:44
【问题描述】:

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

我有一个调用几个函数的主进程。大多数这些函数调用其他更具体的函数等等。涉及一些库,因此可能会发生很多特定错误。 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 中进行自上而下的错误处理的最佳方式是什么?

  • 要将每个异常都提升到顶部,从而将“try except”置于每个调用堆栈的函数之上?
  • 要在每个异常发生时处理它,记录并引发,并且在“顶部”没有“尝试除外”?
  • 有更好的选择吗?

当场完成并提出错误或在“download_file”和/或“workflow_runner”函数中捕获它会更好吗?

我问是因为如果我最终将所有内容都放在顶部,我觉得我最终可能会得到:

except AError
except BError
...
except A4Error

【问题讨论】:

    标签: python python-3.x error-handling software-design


    【解决方案1】:

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

    因此,不同的异常会酌情在不同的层捕获。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      相关资源
      最近更新 更多