处理异常后恢复的Pythonic方法

doc*_*rer 2 python resume exception

我有一个操作物理设备的脚本。设备有时会发生物理故障,当发生故障时,我想重置设备并继续执行脚本。我有这个:

while True:
    do_device_control()
    device_status = get_device_status()
    if device_status == 'Fault':
        reset_device()
Run Code Online (Sandbox Code Playgroud)

在我看来,更整洁/更Python化的方法会引发异常:

try:
    while True:
        do_device_control()
        device_status = get_device_status()
        if device_status == 'Fault':
            raise DeviceFaultException()

except DeviceFaultException:
    reset_device()
Run Code Online (Sandbox Code Playgroud)

但是据我所知,在重置设备后无法恢复脚本。有没有一种方法可以使这种情况下的异常处理有效,或者比我目前使用的更Python化的方法?

Jam*_*ugh 5

Python的一个常见用法是“要求宽恕而不是允许”,这非常适合您的问题。像下面这样的实现就足够了:

while True:
    try:
        do_device_control()
    except DeviceFaultException:
        reset_device()
Run Code Online (Sandbox Code Playgroud)

这应该与使用if语句的原始代码块中的行为类似。

但是,您可能注意到我没有device_status在代码中检查。这是因为如果do_device_control函数无法完成其任务,则应允许该函数引发异常。这使您可以在执行动作时处理异常。

在使用与代码异步运行的设备的环境中,可以检查设备状态,并且状态良好。然后在检查和您的do_device_control功能之间可能会失败。这是为什么存在“请求宽恕而不是允许”范式的一个例子。

当然,此示例仅在您可以期望do_device_control函数抛出某种异常或对其进行更改以使其起作用的情况下才有效。如果您无法期望/更改此行为,则最好使用带有if语句的第一个代码块,而不是显式引发异常以立即将其捕获在同一代码块中。