Python3异常处理和捕获
我正在为一个非常具体的任务设计一个工作流引擎,我正在考虑异常处理 我有一个调用一些函数的主进程。大多数函数调用其他更具体的函数等等。由于涉及到一些库,因此可能会发生许多特定错误。IOError、OSError、AuthenticationException 当出现错误时,我必须停止工作流并将其记录下来,以便在错误解决后从该点继续 举例说明我的意思:Python3异常处理和捕获,python,python-3.x,error-handling,software-design,Python,Python 3.x,Error Handling,Software Design,我正在为一个非常具体的任务设计一个工作流引擎,我正在考虑异常处理 我有一个调用一些函数的主进程。大多数函数调用其他更具体的函数等等。由于涉及到一些库,因此可能会发生许多特定错误。IOError、OSError、AuthenticationException 当出现错误时,我必须停止工作流并将其记录下来,以便在错误解决后从该点继续 举例说明我的意思: def workflow_runner(): download_file() ... (more calls with th
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
您的基本、常规、模块化功能
我的问题是:
在Python3中,从上到下的错误处理的最佳方式是什么
- 将每个异常提升到顶部,从而将“try except”置于堆栈中每个函数调用之上
- 若要在发生异常时处理每个异常,请记录并引发,并且在“顶部”没有“除外尝试”选项
- 有更好的选择吗
except AError
except BError
...
except A4Error
这要看情况而定……您在可以采取措施的时候捕获异常。这在不同的函数和不同的异常类型之间是不同的。一段代码调用子系统(一般来说是任何函数),它知道子系统可能引发异常A
、B
或C
。它现在需要决定它期望哪些异常和/或它可以对每一个异常做些什么。最后,它可能决定捕获A
和B
异常,但捕获C
异常是没有意义的,因为它无法对它们做任何事情。这意味着这段代码可能会引发C
异常,它的调用者需要意识到这一点并做出同样的决定
因此,在不同的层上捕获不同的异常(视情况而定)
更具体地说,假设您有一个系统,它由一些HTTP对象组成,这些对象从远程服务器下载一些东西,一些作业管理器将这些HTTP对象组合在一起并将其结果存储在数据库中,以及一个启动和停止作业管理器的顶级协调器。当网络请求失败时,HTTP对象可能会引发各种HTTP异常,当数据库出现问题时,作业管理器可能会引发异常。你可能会让工作经理担心HTTP错误,比如404
,但不会担心基本的错误,比如computerdoesnthavenetworkinterface
错误;同样地,数据库是不可访问的
异常是作业经理无法处理的,可能会导致应用程序终止。这取决于……您在可以处理异常的地方发现异常。这在不同的函数和不同的异常类型之间是不同的。一段代码调用子系统(一般来说是任何函数),它知道子系统可能引发异常A
、B
或C
。它现在需要决定它期望哪些异常和/或它可以对每一个异常做些什么。最后,它可能决定捕获A
和B
异常,但捕获C
异常是没有意义的,因为它无法对它们做任何事情。这意味着这段代码可能会引发C
异常,它的调用者需要意识到这一点并做出同样的决定
因此,在不同的层上捕获不同的异常(视情况而定)
更具体地说,假设您有一个系统,它由一些HTTP对象组成,这些对象从远程服务器下载一些东西,一些作业管理器将这些HTTP对象组合在一起并将其结果存储在数据库中,以及一个启动和停止作业管理器的顶级协调器。当网络请求失败时,HTTP对象可能会引发各种HTTP异常,当数据库出现问题时,作业管理器可能会引发异常。你可能会让工作经理担心HTTP错误,比如404
,但不会担心基本的错误,比如computerdoesnthavenetworkinterface
错误;同样地,DatabaseIsUnreachable
异常是作业经理无法处理的,可能会导致应用程序终止