gpt4 book ai didi

Python 3 异常处理和捕获

转载 作者:行者123 更新时间:2023-12-03 08:11:06 25 4
gpt4 key购买 nike

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

我有一个调用几个函数的主进程。大多数这些函数调用其他更具体的函数等等。涉及一些库,因此可能会发生很多特定错误。 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

    最佳答案

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

    因此,不同的异常会在不同的层被适本地捕获。

    更具体地说,假设你有一个系统,它由一些 HTTP 对象组成,它从远程服务器下载一些东西,一些作业管理器处理一堆这些 HTTP 对象并将它们的结果存储在数据库中,以及一个启动的顶级协调器并停止作业管理器。当网络请求失败时,HTTP 对象显然会引发各种 HTTP 异常,而当数据库出现问题时,作业管理器可能会引发异常。您可能会让作业经理担心诸如 404 之类的 HTTP 错误。 ,但与 ComputerDoesntHaveANetworkInterface 之类的基本内容无关错误;同样DatabaseIsUnreachable异常是作业经理可以做的任何事情,并且可能会导致应用程序的终止。

    关于Python 3 异常处理和捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48543342/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com