异常处理
"""
try:
except:
"""
# 捕获异常
try: # try表示尝试,里面放有可能出错的代码
x = 5 / 0
print(x)
except ZeroDivisionError as e: # except 异常类型 as 实例 e:
print('程序遇到错误:不能除零', e) # 捕获到特定的异常:ZeroDivisionError
except: # 其他异常错误 except后面什么不带 捕获所有异常
print('程序遇到错误:其他错误')
else: # 没有异常
print('程序没有错误:正常执行')
属性异常
class Person:
def __init__(self, name):
self.name = name
p = Person('jiuren')
try:
print(p.age) # 没有age这个属性
except AttributeError as e:
print('遇到属性异常', e)
finally:
一般用于文件或数据库操作
f = open('data.txt') # 打开文件,f是全局的
try:
f.read()
except:
print('文件打开遇到错误')
finally: # 不管有没有异常,都要执行这句,一般用于释放内存
f.close()
# 文件可能已经打开,但操作时遇到问题,需要关闭文件 释放内存
raise:
自己手动抛出异常
def method():
# 假设这是一个必须写具体内容的方法,如果什么不做直接调用 就让它抛出异常
raise NotImplementedError('该代码还未实现')
像ZeroDivisionError、AttributeError这些Python内置好的异常还有很多种
可去Python官方文档查看
有些模块也自带很多异常
简单的测试开发
测试一个函数
需要测试的代码:name.py
def get_formatted_name(first, lasr):
full_name = '{} {}'.format(first, lasr)
return full_name.title()
# 字符串.title() 把每个单词第一个字母改成大写
print(get_formatted_name('jiuren', 'tom lee'))
# Jiuren Tom Lee
测试用例
import unittest
from name import get_formatted_name # 导入需要测试的代码
class NameTest(unittest.TestCase):
# 定义一个类,继承自测试模块里面的一个类:unittest.TestCase
def test_title_name(self): # 把测试定义到一个以test_开头的方法
formatted_name = get_formatted_name('tom', 'lee')
# 把要测试的函数传入参数 赋给一个变量
self.assertEqual(formatted_name, 'Tom Lee') # 使用ass开头的一些方法 断言
# assertEqual:是否相等
# 判断传入的'tom', 'lee' 首字母到大写后是否和Tom Lee相等
if __name__ == '__main__':
unittest.main() # 运行通过unittest下面的main()方法
测试一个类
需要测试的代码:coder.py
class Coder:
def __init__(self, name):
self.name = name
self.skills = []
def mastering_skill(self, skill): # 增加技能方法
self.skills.append(skill)
def show_skills(self): # 查看已掌握技能方法
print(self.name + '掌握技能:')
for skill in self.skills:
print('-', skill)
c = Coder('Tom')
c.mastering_skill('Python')
c.mastering_skill('C#')
c.show_skills()
测试用例
import unittest
from coder import Coder
class CoderTestCase(unittest.TestCase):
def setUp(self): # unittest自带的一个函数:用于初始化
self.c = Coder('Jiuren') # 实例化对象
# self.c.skills = ('Python', 'C#', '.NET')
self.c.skills = ['Python', 'C#', '.NET']
self.c.skills.append('打游戏')
# self.c.mastering_skill('睡觉')
def test_skill_in(self):
self.assertIn('Python', self.c.skills)
# 这里就不用再实例化要测试的类 定义一些参数了
# assertIn:是否包含
# def test_skill(self):
# c = Coder('Jiuren')
# c.mastering_skill('Python')
# c.mastering_skill('C#')
#
# self.assertIn('Python', c.skills)
if __name__ == '__main__':
unittest.main()