90%老手的都不知道,Python异常还能写得如此优雅!

别再为‘more than one device/emulator’抓狂!手把手教你用Python脚本自动选择ADB设备 本文详细介绍了如何使用Python脚本解决ADB多设备冲突问题,特别是针对'more than one device/emulator'错误的自动化解决方案。通过智能设备选择系统、异常处理机制和集成到自动化测试框架的实践,帮助开发者高效管理多设备环境,提升测试效率和稳定性。 阅读详情

604e823e29f5ecd58192b0cf9e12be0d.png

bb156e560f11e79ea2da82b40ebfcd0c.png

在写程序时,我们会经常碰到程序出现异常,这时候我们就不得不处理这些异常,以保证程序的健壮性。

处理异常的版本有以下几种,你通常的做法是哪种?

e813b78479774487c027b0ebad011713.png


不负责任版本

这种情况下,不作任何处理,任由程序报错,从而导致程序中断。

针对简单的程序,这样做没什么问题,大不了我遇到问题之后把问题解决,然后重新运行。但是如果是复杂的系统就会很麻烦了,可能你一个异常阻塞了系统的运行,带来灾难性的后果。

简单处理版本

简单处理版本,就是加上异常捕获,在发生异常时记录日志,时候可以通过日志来定位异常。

def do_something():
    pass
def log_error(xxx):
    pass

try:
   do_something()
except:
    log_error(xxxx)
改进处理版本

对于简单处理版本做了改进,增加重试次数。这个在爬虫程序中比较常见,第一次请求超时,可能过一会再请求就成功了,所以重试几次可能会消除异常。

attempts = 0
success = False
while attempts < 3 and not success:
    try:
        do_something()
        success = True
    except:
        attempts += 1
        if attempts == 3:
            break

但是这样做仍然不够优雅,你可能要在很多地方去写这种重试的硬编码,程序看起来乱糟糟的。

cc5212d83fcda7f06d3fbe72f2a39eab.png


今天就给大家介绍一个第三方模块 —— retrying。它是对程序中异常重试的一种优雅的解决方案。

安装与使用
安装

安装命令还是那么平淡无奇:

pip install retrying

使用

下面给大家介绍一下这个装饰函数有哪些可以使用的参数。

生命不息,奋斗不止

retrying 提供一个装饰器函数 retry,被装饰的函数会在运行失败的情况下重新执行,默认一直报错就一直重试。

import random
from retrying import retry

@retry
def do_something_unreliable():
    if random.randint(0, 10) > 1:
        print("just have a test")
        raise IOError("raise exception!")
    else:
        return "good job!"

print(do_something_unreliable())

运行这个程序,大家可以看到每次打印“just have a test”这句话的次数都不一样。这是由于我们程序中只要随机整数大于1就会打印并且抛出异常。但是由于我们有装饰器函数 retry,所以在发生异常就会重新再次执行方法,直到随机整数大于1,就会打印“good job!”。

做人不能太固执

这种无休止地重试,简直是浪费生命,浪费资源。我们要建设绿色家园,所以不妨加点限制:

# 最大重试次数
@retry(stop_max_attempt_number=5)
def do_something_limited():
    print("do something several times")
    raise Exception("raise exception")

do_something_limited()
珍惜有限的时间

一寸光阴一寸金,寸金难买寸光阴。我们要珍惜有限的时间,所以不妨给我们的重试加个时间限制:

# 限制最长重试时间(从执行方法开始计算)
@retry(stop_max_delay=5000)
def do_something_in_time():
    print("do something in time")
    raise Exception("raise exception")

do_something_in_time()
驻足欣赏路上风景

人生匆匆数十载,不要一路狂奔而忘记欣赏路边的美景,有时候我们需要花点时间来欣赏一路的美景:

# 设置固定重试时间
@retry(wait_fixed=2000)
def wait_fixed_time():
    print("wait")
    raise Exception("raise exception")

wait_fixed_time()
给失败设个限

虽说我们需要屡败屡战的韧性,但是失败也要有个限度,不能在失败中度过一生:

# 设置重试时间的随机范围
@retry(wait_random_min=1000,wait_random_max=2000)
def wait_random_time():
    print("wait")
    raise Exception("raise exception")

wait_random_time()
有些人值得等待

茫茫人海中,我就是要等到那个对的人:

# 根据异常重试
def retry_if_io_error(exception):
    return isinstance(exception, IOError)

# 设置特定异常类型重试
@retry(retry_on_exception=retry_if_io_error)
def retry_special_error():
    print("retry io error")
    raise IOError("raise exception")

retry_special_error()

我们自己定义一个函数,判断异常类型,然后将函数作为参数传给装饰函数 retry ,如果异常类型符合,就会进行重试。

有些结果是我们希望见到的

人生并不是一帆风顺,有些时候我们会遇到挫折,这些挫折也许在一开始就是我们想要的:

# 通过返回值判断是否重试
def retry_if_result_none(result):
    """Return True if we should retry (in this case when result is None), False otherwise"""
    # return result is None
    if result =="111":
        return True


@retry(retry_on_result=retry_if_result_none)
def might_return_none():
    print("Retry forever ignoring Exceptions with no wait if return value is None")
    return "111"

might_return_none()

这里我们定义了一个判断返回值的函数,然后将这个函数作为参数传给 retry 装饰函数。当结果返回是“111”时,就会一直重试执行 might_return_none 函数。

生活丰富多彩,并不单调

我们的生活是丰富多彩的,从来都没有很单调。所以上面这些参数,我们可以随意组合使用,并不限定每次只能用一个。比如你可以限定遇到 IOError 时进行重试,并且重试次数最多5次。

总结

人生不可重来,但是Python可以重试!

我已经将retrying 这个装饰函数的使用方法毫无保留地奉献给各位看官了,赶快用起来吧!

有兴趣的同学可以火速加入我们的星球

3周零基础入门提供10节课程

全年12节趣味实战项目含源码,

每月奖励优秀的Top3同学送书

专业的答疑群,大厂的老师保姆式的教学

如果不满意,三天内随意退款!一年88,现在优惠16元

da77be60762317172224c4dd0b4537ae.png

扫码加入,3周零基础入门

推荐阅读:
入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径
干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影
趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!
AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影
小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|

年度爆款文案

点阅读原文,看200个Python案例!

从Maya到Unity:3D模型导入全流程避坑指南(含FBX导出设置) 本文详细解析了从Maya导出3D模型至Unity的全流程,重点剖析了FBX格式作为跨软件协作“中间人”的优劣与核心设置。指南涵盖了Maya端模型清理、FBX导出关键配置(如嵌入媒体、轴转换),以及Unity端的模型、材质、动画导入优化与常见问题(如材质丢失、UV法线错误、骨骼动画错乱)的实战解决方案,旨在帮助3D美术师与技术美术建立稳定、高效的工作流。 阅读详情

相关推荐

gdb对dwarf调试信息的解析和使用

gdb的对dwarf的调试信息的解析到使用的过程分析

JS072110的专栏 9568

python代码大全

python代码大全

zy0412326的专栏 3万+

systemView的安装使用

systemView的安装使用

qq_33712422的博客 3986

30个超实用的Python极简代码,五分钟get

学Python怎样才学的好又快呢,当然是实战各种小项目,只有自己动手动脑,才能最高效的搞懂规则,初学者也可以尝试着自己实现哦。(文末有Python资料领取) Python是机器学习最广泛采用的编程语言,也是目前最流行的语言之一,它的简单和易用性造就了它如此流行的原因。如果你对Python感兴趣的话,希望这篇文章能给你带一些启发。

libaiup的博客 1万+

让Claude连续写代码24小时会发生什么?揭秘长时运行”架构背后的工程逻辑与未来

AI长时运行实验揭示软件开发新范式 Claude Opus通过Harness框架24小时独立开发全栈应用的成功实验,展示了AI从辅助工具向异步协作者的进化。实验采用"上下文轮转"机制解决记忆管理难题,将任务拆解为微周期并通过文件系统同步进度。核心突破在于:1)TDD成为AI自治基石,200+测试用例确保开发不偏航;2)文件取代对话成为AI间高效沟通介质;3)开发者角色重构为需求定义和框架设计者。该实验证明,通过严谨的架构约束和验收标准,AI可完成复杂长周期任务,预示着软件开发将从手工作坊

老孙 | Ethan Sun 的博客:AI 智能体与 AI 原生软件的工程实践 1094

SAP 实施:Waterfall vs. Agile —— 一场“结构性矛盾“的深刻比较先说结论:在 SAP 世界里,这从来不是“谁更好“的宗教问题,而是“你的项目 DNA 是什么“的战略选择。​

SAP 实施:Waterfall vs. Agile —— 一场"结构性矛盾"的深刻比较 先说结论:在 SAP 世界里,这从来不是"谁更好"的宗教问题,而是"你的项目 DNA 是什么"的战略选择。​ SAP 早已用 SAP Activate​ 给出了官方态度——它不是纯 Agile,也不是回头去搞旧 Waterfall,而是一个带质量门的混合架构。 1. 先回到本质:两者解决的是不同维度的风险 维度 Waterfall(传统 ASAP 路线)​ Agile(SCRUM/Kanban 式迭代)​

金牌架构师 337

20个pyhton简单代码,适合新手小白零基础!

软件安装报错项目源码运行有误需要帮忙编写代码 or 解决BUG可以点击底部关于我们,帮忙解决!

高级数据分析师,分享Python知识 9320

如何使用freesurfer对T1w结构像进行分区指标的提取?——皮层面积,灰质体积,平均厚度,厚度标准差,平均曲率、高斯曲率、曲率指数、折叠指数

如何使用freesurfer对T1w结构像进行分区指标的提取?——皮层面积,灰质体积,平均厚度,厚度标准差,平均曲率、高斯曲率、曲率指数、折叠指数

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 3788

python新手有手就会的100个代码

python新手有手就会的100个代码

2201_75735270的博客 1万+

EB配置I2c - 实现与PF8200的读写操作

①,基于硬件实现IIC通信(硬件GPIO引脚配置为I2c复用引脚)②,基于软件模拟IO实现IIC通信(代码控制SDA和SCL两个IO引脚的电平来模拟IIC时序)本文章基于64pin的恩智浦S32K146型号的芯片作为主机,从机是NXP的供电芯片。在本次实验中,我们将以使用EB工具链来配置硬件IIC通信。1,EB配置2,代码编写3,测试验证话不多说,走你~写操作比较简单,只需要申明一个I2c配置结构体变量即可。

weixin_48498880的博客 3768

【以太网硬件十九】SGMII到底能不能直接出光模块?

详细解释为什么SGMII可以直接出光模块及其使用限制

highman110的博客 1万+

极简 Python:10 段代码,学会基础 python

本篇共包含 10 段简单的 Python,涉及常用语法和常用库(但毫无疑问删减了很多,比如没有字典)任何不懂的地方可直接留言~注:如果某个地方以 “#” 开始意思是:这是注释。

2401_85339817的博客 4890

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

90%老手的都不知道,Python异常还能写得如此优雅!(1)

在写程序时,我们会经常碰到程序出现异常,这时候我们就不得不处理这些异常,以保证程序的健壮性。处理异常的版本有以下几种,你通常的做法是哪种?这种情况下,不作任何处理,任由程序报错,从而导致程序中断。针对简单的程序,这样做没什么问题,大不了我遇到问题之后把问题解决,然后重新运行。但是如果是复杂的系统就会很麻烦了,可能你一个异常阻塞了系统的运行,带来灾难性的后果。简单处理版本,就是加上异常捕获,在发生异常时记录日志,时候可以通过日志来定位异常。def do_something():passdef log_erro

2401_83703951的博客 715

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

90%老手的都不知道,Python异常还能写得如此优雅!(附零基础学习资料)

90%老手的都不知道,Python异常还能写得如此优雅!(附零基础学习资料)

隔壁王叔的博客 175

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

90%老手的都不知道,Python异常还能写得如此优雅

简单处理版本,就是加上异常捕获,在发生异常时记录日志,时候可以通过日志来定位异常。

874

90%老手的都不知道,Python异常还能写得如此优雅,35岁之后找不到工作怎么办

except:break但是这样做仍然不够优雅,你可能要在很多地方去写这种重试的硬编码,程序看起来乱糟糟的。今天就给大家介绍一个第三方模块 —— retrying。它是对程序中异常重试的一种优雅的解决方案。

m0_60707660的博客 334

Python字符串格式化全解析:从%到f-string的四种方法对比与实践

字符串格式化是编程中的基础概念,它允许将变量值嵌入到固定文本模板中,实现动态内容生成。其原理是通过占位符或表达式在运行时替换为实际值,从而提升代码的灵活性和可维护性。在Python中,这一技术尤为重要,因为它直接关系到代码的可读性、性能与安全性。从早期的%操作符到现代的f-string,每种方法都有其设计哲学和适用场景。例如,f-string以其卓越的性能和直观的语法成为现代Python开发的首选,尤其适合高性能场景和调试输出;而str.format()则在处理动态模板和国际化(i18n)方面具有独特优势。

weixin_30493401的博客 420

Python文件操作与异常处理:从能跑通到可交付的工程分水岭

文件操作和异常处理是Python工程化落地的核心基础能力,本质是管理操作系统资源生命周期与构建可控失败路径。理解open()背后的缓冲区、句柄、编码机制,掌握pathlib跨平台路径处理、utf-8-sig/BOM兼容方案,以及try-except分层捕获(业务层精确匹配+入口点宽泛兜底)、异常链raise ... from ...、结构化logging等关键技术,直接决定程序在真实环境中的健壮性与可维护性。本文聚焦生产级实践,覆盖路径陷阱、中文乱码根治、大文件性能优化及配置自愈系统实现。

weixin_30572613的博客 328

写好代码的7个工程实践:从可读性到可维护性

在软件工程中,'能运行'的代码只是基础门槛,真正决定职业竞争力的是代码的可读性、可维护性与协作效率。本文围绕变量命名规范、函数接口设计、文档化标准、内存与性能优化、Git协作流程、异常处理机制及自动化工具链等核心工程实践展开,融合Python数据工程真实场景,强调类型提示、docstring、向量化计算、分块处理、PR审查文化、TDD设计思维与安全编码原则。内容直击开发者日常痛点——如硬编码、魔数滥用、注释失焦、内存泄漏与测试缺失,并提供可立即落地的检查清单与实操示例,助力工程师将‘能用’代码升级为经得起时

weixin_33895516的博客 454
上一篇: 分享几段祖传的Python代码,拿来直接使用!
下一篇: 攻略指南:参加英伟达GTC全球盛会,在线面基黄仁勋,吴恩达,还有奖品拿!...
菜鸟学Python
博客等级 码龄9年 8089粉丝 571原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值