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化的方法?
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语句的第一个代码块,而不是显式引发异常以立即将其捕获在同一代码块中。
| 归档时间: |
|
| 查看次数: |
49 次 |
| 最近记录: |