使用Azure Python SDK创建资源时如何校验是否创建成功?
Azure Python SDK LROPoller资源创建校验最优方案
三种方案中方案2为最优选择,结合官方异常体系做适配即可实现最安全规范的校验,无需手动实现轮询或状态判断逻辑。
各方案优劣对比
- 方案1:属于重复造轮子的冗余实现,
done()仅能判断操作是否结束,无法区分操作是成功结束还是失败结束,自定义的轮询计数逻辑容易出现超时时间不合理、漏处理异常状态的问题,且SDK内部已经做了符合Azure服务规范的轮询间隔优化,完全不需要自行实现。 - 方案3:
wait()仅会等待操作执行结束,不会主动判断操作结果是成功还是失败,手动校验状态的逻辑容易遗漏枚举值,后续SDK更新状态枚举后还需要同步修改判断逻辑,维护成本高。 - 方案2:
result()是官方推荐的标准用法,天然具备以下优势:- 内部自动实现轮询逻辑,会按照服务端返回的建议间隔查询状态,效率高于自定义实现
- 资源创建失败(权限不足、参数错误、配额不够等场景)时会主动抛出对应异常,无需手动判断状态
- 支持直接传入超时参数,超时会自动抛出
TimeoutError,无需自行实现计数逻辑
示例中的isinstance判断属于冗余逻辑,只要result()正常返回无异常,就已经是对应资源的实例对象,仅特殊业务校验场景需要加该判断。
更规范的实现代码
from azure.core.exceptions import HttpResponseError, TimeoutError try: poller = client.virtual_machines.begin_create_or_update(...) # 传入超时时间(单位为秒),成功直接返回虚拟机实例,失败自动抛异常 vm = poller.result(timeout=300) # 如有额外业务校验需求,可追加判断预配状态 if vm.provisioning_state != "Succeeded": raise ValueError(f"虚拟机预配状态异常: {vm.provisioning_state}") # 后续业务逻辑 except HttpResponseError as e: # 处理资源创建失败场景 print(f"资源创建失败: {e.message}") except TimeoutError: # 处理超时场景,可按需选择取消操作或延长超时时间 print("资源创建超时") except Exception as e: # 其他异常兜底处理 print(f"未知错误: {str(e)}
如果是不需要等待资源创建完成的异步场景,可以使用done()做非阻塞的状态判断;如果需要确认资源创建成功再执行后续逻辑,直接调用result()是最简单安全的选择。
内容的提问来源于stack exchange,提问作者ArigatoManga
相关产品推荐
相关产品推荐

