python的异常处理
在所有的程序中,都会遇到异常,有些异常是代码编写的时候产生的,在前期过程中可能会直接导致程序无法运行。这一类的异常,在编写代码的时候,程序可以直接排查修改。但有些异常,是在程序运行过程中产生的,可能是与用户交互获取的数据无法识别,也或者是网络请求失败导致程序无法继续等等原因。为了防止程序崩溃,这一类的错误,就需要程序员在编写的时候提前考虑到并进行相应的异常处理。每一门语言基本都有自己相应的异常防御机制,python尤其如此,不仅给了错误调试语句,还提供了庞大的内置异常类,让我们可以精准的针对不同异常给出不同的处理方式。关于python中具体的异常分类信息,可以参照官方文档,地址如下:(在官方文档中,内置异常还包括了警告和异常层次,建议一起看一下)
中文地址:http://python.usyiyi.cn/translate/python_352/library/exceptions.html#concrete-exceptions
英文地址:https://docs.python.org/3/library/exceptions.html#concrete-exceptions
在知道了具体的异常分类后,需要讨论的是预测有异常发生的时候,应该如何处理,python的异常防御相对十分简单,常用只有三条语句,并且在调试的时候无需全部使用。先看一个简单的调试语句:
try:
print(name) #打印变量name的值
except Exception:#如果有异常则输出告警 EXception可以捕获python中任意异常,它属于异常基类
print("Error !")
"""输出结果如下
/Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 /Users/penglong/Documents/python/s10/day4/异常处理.py
Error !
Process finished with exit code 0 """
代码如上所示,是一个简单异常处理,代码模块为try-except。try的代码内容为业务模块,except 后接需要捕获的异常类型,上面的代码为了演示,直接使用了基类,在实际运用中我们常常需要捕获具体异常类,然后给出特定的处理方式,具体为在下一份代码中说明。except下属的代码为捕获异常后的处理模块。在简单演示了一个异常处理后,下面看一份稍微复杂的异常处理,同时会提到关于异常处理的另外两条语句
namlist = ['test1','test2']#定义一个数组,长度为2
try:
print (namlist[3])#在try的代码块尝试打印namlist[3] 很明显下标越界
except NameError as error:#尝试捕获NameError,并将其打印信息赋给error
#NameError的具体定义参见官方文档。下同
print("NameError:",error)#在except的代码块 打印捕获的异常信息
except IndexError as error:#在尝试捕获上一个异常之后,直接尝试捕获另一个异常。
print ("IndexError:",error)
except Exception as error:#再次尝试
print ("Exception:",error)
else:#else语句,此处的用法是接在exception后面。如果我们预测的异常一个都未捕获到,则执行该语句的代码模块
#在本段代码中,这个语句是不可能执行的,因为尝试捕获了Exception异常类。仅仅是说明使用方法
print("如果你一个也没抓到,那我归你好啦")
finally:#finally语句,接在异常防御的最后,可以跳过else直接使用。不管有没有捕获异常,他的下属代码段都会执行
print("不管你抓没抓到,我都在喔")
"""输出结果如下
/Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 /Users/penglong/Documents/python/s10/day4/异常处理.py
IndexError: list index out of range
不管你抓没抓到,我都在喔
Process finished with exit code 0
从上面的输出信息可以看到,我们捕获到了一个IndexError,并且程序最终执行了finally的代码模块。以上基本就是python的常规异常处理了。除了不可控的异常出现之外,有些代码需要特定的运行条件,那么,我们可以认为抛出异常。python中抛异常的方式有两种,断言,或者raise语句。其中,断言需要判定条件,而raise是直接后接需要抛出的异常类型。二者应用场合在我的理解中略有分别,断言常常使用于根据条件成立来决定抛异常的与否。例如,一个变量初始值为空,在程序运行到一半它从网络获取数据,如果没有数据,那么,程序无法执行。就可以使用断言来判定变量是否为空,如果为空,则直接抛异常,并给出告警。当然,raise可以实现同样功能,不过它需要一个if判别。因此,在代码使用上来讲,断言更为简洁,并且它也能被exception捕获。我们首先来看下断言机制:
num1 = 1 #定义俩变量
num2 = 1
"""断言关键字使用,后接判定条件,如果条件成立,则无异常。不成立,抛异常。
用","分割,后接给出的告警信息。告警信息也可以省略"""
assert num1 + num2 == 3, "脑子是个好东西,我希望你有一个。好好计算!"
print("对啦")
"""输出结果
/Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 /Users/penglong/Documents/python/s10/day4/异常处理.py
Traceback (most recent call last):
File "/Users/penglong/Documents/python/s10/day4/异常处理.py", line 20, in <module>
assert num1 + num2 == 3, "脑子是个好东西,我希望你有一个。好好计算!"
AssertionError: 脑子是个好东西,我希望你有一个。好好计算!
Process finished with exit code 1"""
#####断言异常捕获测试########
num1 = 1
num2 = 1
try:
assert num1 + num2 == 3, "脑子是个好东西,我希望你有一个。好好计算!"
except AssertionError as error:
print(error)
"""输出结果
/Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 /Users/penglong/Documents/python/s10/day4/异常处理.py
脑子是个好东西,我希望你有一个。好好计算!
Process finished with exit code 0"""
#可以看到打印信息为我们定义的告警信息
如上,代码给的条件是明显不成立的,所以程序输出了异常。使用上来讲,断言的语句用于已知的条件调试相对简洁。上面的代码异常属于计算错误,并且告警信息属于自定义。但有些异常时python定义的异常类里面存在的,为了方便快捷,我们可以直接抛出,无需定义异常信息,这时就需要raise来解决了。简单代码如下:
raise NameError("name error!")#抛出一个NameError异常,可以给一个打印信息,也可以不给
#常规自定义具体异常信息应该尽量抛Exception类 这里仅做其他类示范。
print("然而并没有错误!")#抛出异常后尝试打印点神马
"""输出结果
/Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 /Users/penglong/Documents/python/s10/day4/异常处理.py
Traceback (most recent call last):
File "/Users/penglong/Documents/python/s10/day4/异常处理.py", line 31, in <module>
raise NameError
NameError: name error!#如果没给参数,则没有具体错误信息
Process finished with exit code 1"""
如上,raise可以直接抛出python自带的异常类,一看就知道哪里出了错误,所以如果不需要条件判定的是自定义异常信息,尽量抛Exception类。这样不至于混淆异常信息。以上代码都立足于功能示范,在实际使用中,一旦抛出异常,程序就会崩溃。所以常规的抛异常大多用于代码调试。如果是为了预防未知信息,抛异常应该出现try--except语句的try下属代码模块,然后用except捕获,再给出相应的解决方案。
以上是python的常见异常处理机制,python的异常类繁多,基本可以满足日常需要。对于异常的文章,大部分会讨论到自定义异常,但我尚未遇到需要自定义异常的情况,往往简单的自定义告警信息等需求都能用内置来直接更改。当然,很多测试场景确实需要更为精确的异常信息,那么可能需要自己重新创建一个异常类模块,在本文暂不讨论。值得一提的是,很多模块可以在python的开源论坛上可以找到,如果确实需要,不妨先去找一下。
python的异常处理的更多相关文章
- python的异常处理及异常类定义
python的异常处理语法和大多数语言相似: try: try块的语句... except exceptiontype1 as var:#使用as语句获得本次捕获到的异常的实例var except块语 ...
- Python进阶----异常处理
Python进阶----异常处理 一丶错误和异常 错误: 语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) #语法错误示范一 if #语法错误示范二 ...
- python的异常处理机制
异常机制己经成为衡量一门编程语言是否成熟的标准之一,使用异常处理机制的 Python 程序有更好的容错性,更加健壮. 对于计算机程序而言,情况就更复杂了一一没有人能保证自己写的程序永远不会出辛苦!就算 ...
- Python 多进程异常处理
前言 最近项目用到了Python作为网站的前端,使用的框架是基于线程池的Cherrypy,但是前端依然有一些比较‘重’的模块.由于python的多线程无法很好的利用多核的性质,所以觉得把这些比较‘重’ ...
- [python]python try异常处理机制
#python的try语句有两种风格 #一:种是处理异常(try/except/else) #二:种是无论是否发生异常都将执行最后的代码(try/finally) try/except/else风格 ...
- python基础-异常处理
一.错误和异常 程序中难免出现错误,而错误分成两种 1.1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) #语法错误示范一 if #语法错误示范二 def te ...
- [python拾遗]异常处理
异常 异常(Exception)是因为程序的例外.违例.出错等情况而在正常控制流以外采取的行为,一般分为如下两个阶段: 1.异常发生:一个错误发生后被打印出来,称为未处理异常,而默认的处理则是自动输出 ...
- python学习-异常处理
小技巧 isinstance(obj,foo) 检查是否obj是否是类 foo 的对象 class Foo(object): pass obj = Foo() isinstance(obj, Foo) ...
- python之异常处理
异常处理是高级编程语言必备的一个功能模块. 一.异常基础 在编程过程中为了增加友好性.容错性和健壮性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户看见大 ...
随机推荐
- RabbitMQ 集群+负载均衡
负载均衡 集群的配置已经搭建好了,代码也成功跑通,成功做到了高可用,但是我们的程序连接节点并不会管哪个服务器在忙.哪个服务器空闲,完全看心情想连谁就连谁.而且代码中要把每个ip的节点都手动的写出来 , ...
- System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本问题
出错的原因: 1.虽然报的是需要安装客户端8.1.7及以上版本,实际是由于.NET账户没有访问Oracle\bin文件夹的权限 2.在 Windows Server 2003/2008 或Window ...
- Django基础,Day3 - 编写 django admin
Django 自带了一个简易编辑后台,可以称为"内容发布器",一般是提供给站点管理员使用的,其最开始也是开发出来提供给报社编辑和发布新闻使用的. 创建超级管理员: $ python ...
- Python
语法 #!/usr/bin/python 注释:# 编码:# -*- coding: UTF-8 -*- 缩进 运算符 算数运算符 + 加 - 两个对象相加 a + b 输出结果 30 - 减 - 得 ...
- Bubble Cup 8 finals B. Bribes (575B)
题意: 给定一棵n个点和有向边构成的树,其中一些边是合法边,一些边是非法边, 经过非法边需要1的费用,并且经过之后费用翻倍. 给定一个长为m的序列,问从点1开始按顺序移动到序列中对应点的总费用. 1& ...
- SQL语句判断数据库、表、字段是否存在
from master..sysdatabases where name='TestDB') print 'TestDB存在'else print 'TestDB不存在' --判断表[Te ...
- Android之分页加载数据
基本的原理和我的上一篇随笔“Android之下拉刷新ListView”差不多,代码里面有注释,这里就不废话了,直接上代码. 自定义的分页显示ListView——PagedListView.java代码 ...
- rcu机制
转载自:再谈Linux内核中的RCU机制-MagicBoy2010-ChinaUnix博客 http://blog.chinaunix.net/uid-23769728-id-3080134.html ...
- C/C++面试题集锦(一)
C/C++面试题集锦(一) */--> C/C++面试题集锦(一) 在类的头文件中进行声明然后在定义文件中实现有什么意义? 一方面使类的实现只编译一次,提高编译效率:另一方面可以实现类的接口和实 ...
- 码云以及git使用
码云的使用方法以及git的连用 创建公钥的方法 打开码云,点击个人资料---->SSH公钥---->点击怎样生成公钥 SSH Keys ssh keys可以让你在你的电脑和Git@OSC知 ...