python-20 异常处理
程序员文章站
2022-04-17 14:37:49
...
在python程序设计中,常见的错误类型
语法错误:
syntaxError
代码的拼写错误
又叫编译错误
运行时错误
在解释执行的时候出现的错误
除数为零
导入的包不存在
打开的文件不存在
逻辑错误
程序可以正常运行,但是结果不正确
python无法解决,可以正常运行,只是结果不对
异常处理机制
java里面:
可以写多个异常类
用 | 隔开
python里面的异常父类
BaseException
Exception SystemExit KeyboardInterrupt GeneratorExit
(1)NameError 尝试访问未命名的变量
(2)SyntaxError 语法错误
(3)AttributeError 访问未知对象的属性
(4)TypeError 类型错误
(5)ValueError 数值错误
(6)ZeroDivisionError 除零错误
(7)IndexError 索引超过边界
(8)KeyError 字典关键字不存在
raise
抛出异常:
Eg:
a = -9
if a<0 :
raise ValueError("数字不能是复数")
结果:
ValueError: 数字不能是复数
python里面的异常处理
python里面只能写一个
try:
可能产生异常的语句
except FileNotFoundException:
捕获异常的语句
except otherException:
捕获异常的语句
else:
没有发生异常的时候执行的语句
finally:
一定会执行的语句,不管是否产生异常
一个例子
try:
f = open("test.txt","r")
f.write("这个是测试的内容")
f1 = open("test1.txt","r")
except IOError:
print("没有找到文件")
else:
print("文件写入成功")
finally:
f.close()
将子类的异常放在前面
没写完
a = (-1,2,-3,4,5)
sum = 0
try:
for i in a:
if i<0:
raise ValueError( str(i) + "<0")
sum += i
except IOError:
print("没有找到文件")
else:
print("文件写入成功")
finally:
f.close()
自定义异常类
1.都要继承 Exception 或者 Exception的子类
2.命名一般都是Error或者Exception为后缀
class NumberError(Exception):
def __init__(self,data):
Exception.__init_(self,data)
self.data = data
def __str__(self):
return self.data + "非法数值"
def total(data):
total = 0;
for i in data:
if i<0:
raise NumberError(str(i))
total += i
return total
断言
断言的一般形式:
1.前置条件断言
2.后置条件断言
3.前后不变断言
声明的形式
assert 布尔类型的表达式
assert 布尔类型的表达式,字符串表达式
python的解释器
python的解释器有两种运行模式,调试模式和优化模式
通常为调试模式 内置只读变量__debug__ 的值为true
但是如果使用选项-o运行时,则改为优化模式,__debug__的值为false
a = int(input("please input a "))
b = int(input("please input b "))
使用 -o
python -o test.py
断言扩展
assert 布尔类型的表达式
assert 布尔类型的函数 (用的比较少)
改进断言
开源的测试框架
py.test 轻量级的测试框架
利用python的断言对测试进行更加直观性的说明
1.安装
pip install -U pytest
--version 查看版本
2.
import pytest
def test_case():
expected = 'Hello'
actual = 'hello'
assert expected == actual
if __name__=='__main__':
pytest.main()
运行:
py.test test.py
__________________________________ test_case __________________________________
def test_case():
expected = 'Hello'
actual = 'hello'
> assert expected == actual
E AssertionError: assert 'Hello' == 'hello'
E - Hello
E ? ^
E + hello
E ? ^
test.py:5: AssertionError
========================== 1 failed in 0.09 seconds ===========================
北方用 unittest
python 自带的单元测试框架
不推荐使用assert 语句 而是使用断言方法 self.assertXXX()
import unittest
class TestStringMethod(unittest.TestCase):
def test_upper(self):
self.assertEqual('foo'.upper(),'FoO')
if __name__=='__main__':
unittest.main()
结果:
F
======================================================================
FAIL: test_upper (__main__.TestStringMethod)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Users\li_yu\Desktop\test.py", line 5, in test_upper
self.assertEqual('foo'.upper(),'FoO')
AssertionError: 'FOO' != 'FoO'
- FOO
? ^
+ FoO
? ^
----------------------------------------------------------------------
Ran 1 test in 0.022s
FAILED (failures=1)
ptest 测试框架
特点:既可以实现断言,并且声称测试报告,以图形化的方式展示
作者是 Karl 大神
作者简介:最初是java开发的,框架里面的语法很多沿用java的注解
运行:
python 2:
ptest -t 文件名.类名.方法名
python 3:
ptest3 -t 文件名.类名.方法名
下一篇: 女人笑话十则及其幽默