繁体   English   中英

Python 3异常处理和捕获

[英]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中,什么被认为是进行自上而下的错误处理的最佳方法?

  • 要将每个异常置于顶部,然后在每个函数上放置“ try try”,以调用堆栈?
  • 要处理每个异常,请记录并引发并且在“顶部”没有“除”以外的其他内容?
  • 一些更好的选择?

只是当场完成并引发错误,或者将其捕获在“ download_file”和/或“ workflow_runner”函数中会更好吗?

我问,因为如果我最终把所有事情都排在了首位,我觉得自己可能会结局:

except AError
except BError
...
except A4Error

这取决于…您在可以采取措施的地方发现了一个例外。 不同的功能和不同的异常类型之间有所不同。 一段代码称为子系统(通常来说是任何函数),并且知道子系统可能引发异常ABC 现在,它需要确定预期的异常情况和/或对每个异常情况可以采取的措施。 最后,它可能决定捕获AB异常,但是捕获C异常对它没有意义,因为它无法对它们做任何事情。 现在,这意味着这段代码可能引发C异常,并且其调用者需要意识到这一点并做出相同类型的决策。

因此,适当时在不同的层捕获了不同的异常。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM