Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3异常处理和捕获_Python_Python 3.x_Error Handling_Software Design - Fatal编程技术网

Python3异常处理和捕获

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

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

我有一个调用一些函数的主进程。大多数函数调用其他更具体的函数等等。由于涉及到一些库,因此可能会发生许多特定错误。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
您的基本、常规、模块化功能

我的问题是:

在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
异常是作业经理无法处理的,可能会导致应用程序终止