Python 异常 及Unittest的测试

Python 异常

打开文件
f1 = open(‘/tmp/hello/test.txt’,‘r’)

一,Python的运行时错误称作异常
1,语法错误:软件的结构上有错误而导致不能被解释器解释或不能被编译器编译

2,逻辑错误,由于不完整或不合法的输入所致,也可能是逻辑无法生成,计算或者输出结果需要的过程无法执行等

二,Python异常是一个对象,表示错误或意外情况

三,在Python检测到一个错误时,将触发一个异常
1,Python可以通过异常传导及机制传递一个异常对象,发出一个异常情况出现的信号
2,程序员也可以在代码中手动触发异常

四,Python异常也可以理解为:程序出现了错误而正常控制流以外采取的行为
1,第一阶段:解释器触发异常,此时当前程序流将被打断!
2,第二阶段:异常处理,如忽略非致命性错误,减轻错误带来的影响等!

五,错误处理
1,Python的默认处理:停止程序,打印错误消息
2,使用try语句处理异常并从异常中恢复

六,事件通知
1,用于发出有效状态信号

七,特殊情况处理
1,无法调整代码去处理的场景

八,终止行为
1,try/finally语句可确保执行必须的结束处理机制

九,非常规控制流程
1,异常是一种高级跳转(goto)的机制

十,异常通过try语句来检测
1,任何在try语句块里的代码都会被检测,以检查有无异常发生

十一,try语句主要有两种形式
1,try-except:检测和处理异常
·可以有多个except
·支持使用else子句处理没有探测异常的执行的代码
2,try-finally:仅检查异常并做一些必要的清理工作
·仅能有一个finally

十二,try语句的复合形式
1,try-except-finally

十三,定义了进行异常监控的一段代码,并且提供了处理异常的机制

语法:
1,try:
try_suite
except Exception[,reason]:
except_suite

Python2.X try 的语法:

In [1]: try:
…: f1 = open(‘/tmp/hello/abc.txt’,‘r’)
…: except IOError, e:
…: print “Could not open file /tmp/hello/abc.txt”, e
…:

Python3.X try 的语法:

In [4]: try:
f2 = open(‘/tmp/hello/word.txt’,‘r’)
except IOError as e:
print (“Could not open file /tmp/hello/abc.txt”, e)
…:

十四,try语句可以带多个except子句,还可以有一个可选的else子句,语法格式如下
1,try:
try_suite
except Exception1[,reason]:
suite_exception1
except(Exception2,Exception3,…)[,reason]:
suite_

except: 空except语句用于捕获一切异常
suite_
else:
else_suite
2,except分句个数没有限制,但else只能有一个
3,没有异常发生时,else分句才会执行
4,没有符合的except分句时,异常会向上传递到程序中的之前进入的try中或者到进程的顶层。

十五,无论异常是否发生,finally子句都会执行
1,常用于定义必需进行的清理动作,如关闭文件或断开服务器连接等

十六,finally中的所有代码执行完毕或会继续向上一层引发异常

十七,语法:
1,try:
try_suite
finally:
finally_suite

例子:
      try:f1 = open('/tmp/a.txt','r')
           f1.write('hello world')
      finally:
           f1.close()

总结: Try语句的分句形式
except: 捕捉所有(其他)异常类型
except name: 只捕捉特定的异常
except name,value 捕捉所列的异常和其额外的数据(或实例)
except (name1,name2): 捕捉任何列出的异常
except (name1,name2),value:捕获任何列出的异常,并取得其额外数据
else:
finally: 总是会运行此代码块

语法:
1,try:
try_suite
except Exception1:
suite1_exception1
except(Exception2,Exception3):
suite23_exception23

else:
else_suite
finally:
finally_suite
2,可以替换为在try-finally语句中嵌套try-except语句的形式

try:
try:
try:
except
except
else
finally

自定义异常

一,raise语句显示触发异常
1,raise[SomeException [,args[,traceback]]]
·SomeException :可选,异常的名字,仅能使用字符串,类或实例
·args:可选,以元组的形式传递给异常的参数
·traceback:可选,异常触发时新生成的一个用于异常-正常化的跟踪记录,多用于重新引发异常时

例如:def CrossProduct(seq1,seq2):
if not seq1 or not seq2:
raise ValueError,“Sequence argements must be non-empty”
return[(x1,x2) for x1 in seq1 for x2 in seq2]

Raise 语句的用法大全

raise语法 描述
raise exclass 触发一个异常,从exclass生成一个实例(不含任何异常参数)
raise exclass() 同上,但现在不是类;通过函数调用操作符(function calloperator:
"()"作用于类名生成一个新的exclass实例,同样也没有异常参数)

raise exclass(),args 同上,但同时提供的异常参数args,可以是一个参数也可以是元组
raise exclass(args) 同上
raise exclass,args,tb 同上,但提供一个跟踪记录(traceback)对象tb共使用
raise exclass ,instance 通过实例触发异常(通常是exclass的实例);如果实例时exclass的子类实例,那么这个新异常的类型会是子类的类型(而不是exclass);如果实例既不是exclass的实例也不是exclass子类的实例,那么会是复制此实例为异常参数去生成一个新的exclass实例

raise instance 通过实例触发异常;异常类型是实例的类型;等价于raise instance.class, instance(同上)

raise string (过时的)触发字符串异常

raise string, args 同上,但触发伴随着args

raise string,args,tb 同上,但提供了一个跟踪记录(traceback)对象tb供使用

raise (1.5新增)重新触发前一个异常,如果之前没有异常,触发TypeError

异常对象:
一,Python 异常是内置的经典类Exception的子类的实例
1,为了向后兼容,Python还允许使用字符串或任何经典类型实例
2,Python2.5之后,Exception是从BaseException继承的新式类
二,Python自身引发的所有异常都是Exception的子类的实例

三,大多的标准异常都是由StandardError派生的,其有3个抽象的子类
1,ArithmeticError
·由于算术错误而引发的异常基类
·OverflowError,ZeroDivisionError,FloatingPointError
2,LookupError
·容器在接收到一个无效键或索引时引发的异常的基类
·IndexError,KeyError
3,EnviromentError
·由于外部原因而导致的异常的基类
·IOError,OSError,WindowsError

 标准异常类

一,AssertionError
1,断言语句失败
二,AttributeError
1,属性引用或赋值失效
三,FloatingPointError
1,浮点型运算失败
四,IOError
1,I/O操作失败
五,ImportError
1,import语句不能找到导入的模块,或者不能找到该模块特别请求的名称
六,IndentationError
1,解析器遇到了一个由于错误的缩进而引发的语法错误
七,IndexError
1,用来索引序列的整数超出了范围

八,KeyError
1,用来索引映射的键不在映射中
九,KeyboardInterrupt
1,用户按了中断键(Ctrl+c,Ctrl+Break或Delete键)
十,MemoryError
1,运算耗尽内存
十一,NameError
1,引用了一个不存在的变量名
十二,NotImplementedError
1,由抽象基类引发的异常,用于指示一个具体的子类必须覆盖一个方法
十三,OSError
1,由模块os中的函数引发的异常,用来指示平台相关的错误
十四,OverflowError
1,整数运算的结果太大导致溢出
十五,SyntaxError
1,语法错误
十六,SystemError
1,Python本身或某些扩展模块中的内部错误
十七,TyptError
1,对某对象执行了不支持的操作
十八,UnboundLocalError
1,引用未绑定值的本地变量
十九,UnicodeError
1,在Unicode的字符串之间进行转换时发生的错误
二十,ValueError
1,应用于某个对象的操作或函数,这个对象具有正确的类型,但却有不适当的值
二十一,WindowsError
1,模块OS中的函数引发的异常,用来指示与Windows相关的错误
二十二,ZeroDivisionError
1,除数为0

自定义异常类
一,自定义异常和多重继承
1,较有效的方法是从自定义异常类和标准异常类进行多重继承,例如:
·class CustomAttributeError(CustomException,AttributeError):
pass
二,标准库中使用的其它异常
2,Python标准库中的许多模块都定义了自己的异常类,如socket中的socket.error

3,等同于自定义的异常类

assert(断言)语句
一,assert语句用于在程序中引入调试代码
1,assert condition[,expression]
·如果condition条件满足,则assert不做任何操作
·如果condition条件不满住,则assert使用expression作为参数实例化AssertionError并引发结果实例

二,注意:如果运行Python时使用了-O优化选项,则assert将是一个空操作,编译器不为assert语句生成代码
1,运行Python时不适用-O选项,则__debug__内置变量为True,否则其值为False
三,assert语句相当于下面的代码
1,if debug:
if not condition:
raise AssertionError,

assert实现:手动触发异常
assert condition[,expression]

例如:
assert 1 == 1 由于表达式正确,则没有异常
assert 1 == 0,‘输出文字’

Python异常对象:
BaseException:

raise触发异常
     
     assert 断言

try-except
try:

except ()
except BaseException
esle

try-finally

try-except-else-finally

try:
except:
else:
finally:

测试: unittest

例如:

In [1]: def get_formatted_name(first,last):
…: full_name = first + ’ ’ + last
…: return full_name.title()

In [8]: class NamesTestCase(unittest.TestCase):
…: def test_first_last_name(self):
…: formatted_name = get_formatted_name(‘janis’,‘joplin’)
…: self.assertEqual(formatted_name,‘Janis Joplin’)
…:

In [9]: unittest.main()

或者 将unittest.main()放入程序中

例如:

In [10]: class NamesTestCase(unittest.TestCase):
…: def test_first_last_name(self):
…: formatted_name = get_formatted_name(‘janis’,‘joplin’)
…: self.assertEqual(formatted_name,‘Janis Joplin’)
…: unittest.main()
…:
…:
.

Ran 1 test in 0.000s

OK

测试类:
1,各种断言的方法:

     方法                      用途

assertEqual(a,b) 核实:a == b
assertNotEqual(a,b) 核实:a != b
assertTrue(x) 核实:x为True
assertFalse(x) 核实:x为False
assertIn(item,list) 核实:item 在 list中
assertNotIn(item,list) 核实:item 不在 list中

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值