社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

python中的异常捕获

生信修炼手册 • 5 年前 • 597 次点击  
欢迎关注”生信修炼手册”!
无论是编程新手还是老手,都会遇到过程序报错,终止执行的情况,对于python的报错信息,可以分为以下两大类
  1. 语法错误,syntax error

  2. 异常, exception

两类报错信息示意如下

# 语法错误>>> 2 x 2  File "", line 1    2 x 2      ^SyntaxError: invalid syntax
# 异常# 除数为0的异常>>> 2 / 0Traceback (most recent call last): File "", line 1, in <module>ZeroDivisionError: division by zero>>>
# 变量未定义的异常>>> a += 1Traceback (most recent call last): File "", line 1, in <module>NameError: name 'a' is not defined

如果对于基础语法不熟悉,就可能编写出语法错误的代码,这种是编程新手常犯的错误,而异常则是因为考虑的不够周全,比如除数为0的异常,可能初次测试时被除数都不为0,开发者就认为代码是ok的,但是当处理的项目多了,某一天处理了一个除数为0的事务时,代码报错了,此时才意识到代码存在bug, 这也是为什么软件开发不能一步到位,而是不断迭代升级的原因,只有当代码处理的项目足够多的,范围足够广,才能够发现现有代码的不足,从而做出改进。

对于代码中可能的异常进行处理,可以增加程序的健壮性。在python中,通过try..except语句进行异常捕获,基本用法如下

>>> def calc(a, b):...     try:...         num = a / b...     except ZeroDivisionError:...         print('[Warning] {} is zero'.format(b))...         num = float('inf') if a >= 0 else float('-inf')...     return num...>>> calc(2, 1)2.0>>> calc(2, 0)[Warning] 0 is zeroinf

try语句的具体原理如下

  1. 将可能存在异常的语句放置在try代码块中

  2. 用except捕获对应的异常,except语句可以有多条,对应多个不同类型的异常,当try中的某条语句跑出异常之后,程序就会根据异常类型,执行对应的except语句

记住所有的异常类型基本是不可能的,在实际开发中,往往是根据经验,先设定几个可能的异常类型,当遇到超出范围的异常时,在修改代码,捕获对应的异常。
try语句有两个可选的语句
  1. else

  2. finally

else语句只有当try中的代码没有抛出异常时,才会执行; finally语句在try语句正常执行或者异常被处理之后就会执行,示例如下

>>> def calc(a, b):...     try:...         num = a / b...     except ZeroDivisionError:...         print('[Warning] {} is zero'.format(b))...         num = float('inf') if a >= 0 else float('-inf')...     


    
except TypeError:...         num = float(a) / float(b)...     except:...         raise...     else:...         print('{} / {} == {}'.format(a, b, num))...     finally:...         print('result is {}'.format(num))...     return num...>>># try语句没有抛出异常,else和finally都执行>>> calc(2, 1)2 / 1 == 2.0result is 2.02.0# try语句抛出异常,else语句没有执行,except处理了异常,finally执行>>> calc(2, 0)[Warning] 0 is zeroresult is infinf# try语句抛出异常,else语句没有执行,except处理了异常,finally执行>>> calc('2', 1)result is 2.02.0# try语句抛出异常,但是没有对应的except处理该异常,程序终止,else和finally都没有执行>>> calc(a, 1)Traceback (most recent call last):  File "", line 1, in NameError: name 'a' is not defined

在实际开发中,初次编码只需要针对已知的异常类型进行处理即可,后续再根据遇到的报错调整代码。

·end·

—如果喜欢,快分享给你的朋友们吧—



原创不易,欢迎收藏,点赞,转发!生信知识浩瀚如海,在生信学习的道路上,让我们一起并肩作战!
本公众号深耕耘生信领域多年,具有丰富的数据分析经验,致力于提供真正有价值的数据分析服务,擅长个性化分析,欢迎有需要的老师和同学前来咨询。
  更多精彩



  写在最后


转发本文至朋友圈,后台私信截图即可加入生信交流群,和小伙伴一起学习交流。


扫描下方二维码,关注我们,解锁更多精彩内容!


一个只分享干货的

生信公众号





Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/63897
 
597 次点击