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 中进行自上而下错误处理的最佳方法是什么?
- 要将每个异常都提升到顶部,从而将 "try except" 放在调用堆栈的每个函数之上?
- 要在发生异常时处理每个异常,记录并引发并且在 "top" 处没有 "try except"?
- 有更好的选择吗?
是直接完成并当场提出错误还是在 "download_file" and/or "workflow_runner" 函数中捕获它更好?
我问是因为如果我最终抓住了顶部的所有东西,我觉得我可能会得到:
except AError
except BError
...
except A4Error
这取决于... 您在可以采取措施的时候捕获到异常。这在不同的函数和不同的异常类型之间是不同的。一段代码调用子系统(一般来说是任何函数),它知道子系统可能会引发异常 A
、B
或 C
。它现在需要决定它期望什么异常 and/or 它可以对它们中的每一个做些什么。最后它可能决定捕获 A
和 B
异常,但是捕获 C
异常是没有意义的,因为它对它们无能为力。现在这意味着这段代码可能会引发 C
异常,其调用者需要意识到这一点并做出相同类型的决定。
所以不同的异常在不同的层被适当地捕获。
更具体地说,假设您有一些系统,其中包含一些从远程服务器下载一些东西的 HTTP 对象,一些处理这些 HTTP 对象并将其结果存储在数据库中的作业管理器,以及一个启动和停止作业管理器的顶级协调器。当网络请求失败时,HTTP 对象显然会引发各种 HTTP 异常,而作业管理器可能会在数据库出现问题时引发异常。您可能会让工作经理担心像 404
这样的 HTTP 错误,而不是像 ComputerDoesntHaveANetworkInterface
这样的基本错误;同样 DatabaseIsUnreachable
异常是工作经理无能为力的,并且可能会导致应用程序终止。
我正在为一项非常具体的任务设计工作流引擎,并且正在考虑异常处理。
我有一个调用几个函数的主进程。这些函数中的大多数调用其他更具体的函数等等。涉及几个库,因此可能会发生很多特定错误。 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" 放在调用堆栈的每个函数之上?
- 要在发生异常时处理每个异常,记录并引发并且在 "top" 处没有 "try except"?
- 有更好的选择吗?
是直接完成并当场提出错误还是在 "download_file" and/or "workflow_runner" 函数中捕获它更好?
我问是因为如果我最终抓住了顶部的所有东西,我觉得我可能会得到:
except AError
except BError
...
except A4Error
这取决于... 您在可以采取措施的时候捕获到异常。这在不同的函数和不同的异常类型之间是不同的。一段代码调用子系统(一般来说是任何函数),它知道子系统可能会引发异常 A
、B
或 C
。它现在需要决定它期望什么异常 and/or 它可以对它们中的每一个做些什么。最后它可能决定捕获 A
和 B
异常,但是捕获 C
异常是没有意义的,因为它对它们无能为力。现在这意味着这段代码可能会引发 C
异常,其调用者需要意识到这一点并做出相同类型的决定。
所以不同的异常在不同的层被适当地捕获。
更具体地说,假设您有一些系统,其中包含一些从远程服务器下载一些东西的 HTTP 对象,一些处理这些 HTTP 对象并将其结果存储在数据库中的作业管理器,以及一个启动和停止作业管理器的顶级协调器。当网络请求失败时,HTTP 对象显然会引发各种 HTTP 异常,而作业管理器可能会在数据库出现问题时引发异常。您可能会让工作经理担心像 404
这样的 HTTP 错误,而不是像 ComputerDoesntHaveANetworkInterface
这样的基本错误;同样 DatabaseIsUnreachable
异常是工作经理无能为力的,并且可能会导致应用程序终止。