python处理异常的4种方式,python异常处理总结
当一个异常程序运行时,这是一个出错的信号。下面这篇文章主要介绍Python异常处理的相关信息。通过示例代码非常详细的介绍,有需要的朋友可以参考一下。
00-1010前言不负责任版简单处理版改进处理版安装使用总结安装使用
目录
在编写程序时,我们经常会遇到程序中的异常。这个时候,我们就要处理这些异常,以保证程序的健壮性。
异常处理有以下版本。你通常的做法是什么?
前言
在这种情况下,不做任何处理,程序就会报错,导致程序中断。
对于简单的程序,这样做没有问题。大不了遇到问题就解决,然后再跑一次。但是,如果是复杂的系统,就会很麻烦。可能你出现了阻塞系统运行的异常,会带来灾难性的后果。
不负责任版本
简单版,就是添加异常捕获,在异常发生时记录日志,然后就可以通过日志定位异常了。
def do_something():
及格
定义日志_错误(xxx):
及格
尝试:
做某事()
例外:
日志错误(xxxx)
简单处理版本
简单处理版本得到了改进,增加了重试次数。在这种爬虫中很常见。第一个请求超时,一段时间后可能会成功,因此重试几次可能会消除异常。
尝试次数=0
成功=假
尝试3次但未成功:
尝试:
做某事()
成功=真
例外:
尝试次数=1
如果尝试次数==3:
破裂
但还是不够优雅。你可能要在很多地方为这个重试写硬编码,程序看起来很乱。
今天给大家介绍一个第三方模块,——重试。对于程序中的异常重试,这是一个很好的解决方案。
改进处理版本
安装与使用
安装命令还是那么平淡无奇:
pip安装重试
安装
以下是一些可用于此装饰功能的参数。
生命不息,奋斗不止
重试提供装饰函数重试。如果运行失败,修饰函数将重新执行。默认情况下,如果报告了错误,它总是会再次尝试。
随机导入
从重试导入重试
@重试
def do _ something _ unreliable():
if random.randint(0,10) 1:
打印(“只是测试一下”)
引发IOError(引发异常!)
else:
回复“干得好!”
print(do_something_unreliable())
运行这个程序,可以看到每次打印“随便考一考”这句话的次数都不一样。这是因为只要随机整数大于1,我们的程序就会打印并抛出异常。然而,由于我们有了decorator函数retry,当异常发生时,该方法将被再次执行,并且“干得好!”将被打印,直到随机整数大于1。
做人不能太固执
这种无休止的重试简直是浪费生命和资源。我们想建立一个绿色家园,所以我们不妨增加一些限制:
#最大重试次数
@retr
y(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 这个装饰函数的使用方法毫无保留地奉献给各位看官了,赶快用起来吧!
到此这篇关于Python异常处理如何写得优雅的文章就介绍到这了,更多相关Python异常处理内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。