1.初识异常
1.1.什么是异常与异常处理
- 异常就是错误
- 异常会导致程序崩溃并停止运行
- 能监控并捕获异常,将异常部位的程序进行修理使得程序继续正常运行
1.2.异常的语法
1 # coding:utf-8 2 3 def upper(str_data): 4 new_str='None' 5 try: 6 new_str=str_data.upper() 7 except: 8 print('程序出错了') 9 return new_str 10 11 result=upper(123) 12 print(result) 13 ''' 14 程序出错了 15 None 16 '''
1.3.捕获通用异常
1 # coding:utf-8 2 3 def upper(str_data): 4 new_str='None' 5 try: 6 new_str=str_data.upper() 7 except Exception as e: 8 print('程序出错了:{}'.format(e)) 9 return new_str 10 11 result=upper(123) 12 print(result) 13 ''' 14 程序出错了:'int' object has no attribute 'upper' 15 None 16 '''
1.4.捕获具体异常
1 # coding:utf-8 2 3 def test(): 4 try: 5 print("try start") 6 1/0 7 print("try finish") #这句代码不会执行,因为1/0已经报错了,直接进入到exception中了 8 except ZeroDivisionError as e: 9 print(e) 10 test() 11 ''' 12 try start 13 division by zero 14 '''
1 # coding:utf-8 2 3 def test(): 4 try: 5 print("try start") 6 print(name) 7 print("try finish") 8 except ZeroDivisionError as e: #except捕获的异常要与实际发生的异常一致,才能捕获到,不然没有用;捕获的是1/0的报错,实际发生的错误是name变量未定义 9 print(e) 10 test() 11 ''' 12 Traceback (most recent call last): 13 File "D:/WorkSpace/Python_Study/test01.py", line 10, in <module> 14 test() 15 File "D:/WorkSpace/Python_Study/test01.py", line 6, in test 16 print(name) 17 NameError: name 'name' is not defined 18 try start 19 '''
1.5.捕获多个异常
2.python内置异常函数
异常类型集合 |
|
异常名称 |
说明 |
Exception |
通用异常类型(基类) |
ZeroDivisionError |
不能整除0 |
AttributeError |
对象没有这个属性 |
IOError |
输入输出操作失败 |
IndexError |
没有当前的索引 |
KeyError |
没有这个键值(key) |
NameError |
没有这个变量(未初始化对象) |
SyntaxError |
Python语法错误 |
SystemError |
解释器的系统错误 |
VauleError |
传入的参数错误 |
3.异常中的finally
finally的功能:
- 无论是否发生异常,一定会执行的代码块
- 在函数中,即便在try或except中进行了return也依然会执行finally语法快
- try语法至少要伴随except或finally中的一个
- 语法:try: <> except: <> finally: <> View Code
1 # coding:utf-8 2 3 def test(): 4 try: 5 return "try" 6 except: 7 return "except" 8 finally: 9 return "finally" 10 11 print(test()) #finally
4.自定义异常
4.1.自定义抛出异常raise
raise:将信息以报错的形式抛出
1 # coding:utf-8 2 3 def test(number): 4 if number==100: 5 raise ValueError("number不能等于100") 6 return number 7 print(test(50)) #50 8 print(test(100)) 9 ''' 10 Traceback (most recent call last): 11 File "D:/WorkSpace/Python_Study/test01.py", line 8, in <module> 12 print(test(100)) 13 File "D:/WorkSpace/Python_Study/test01.py", line 5, in test 14 raise ValueError("number不能等于100") 15 ValueError: number不能等于100 16 '''
1 # coding:utf-8 2 3 # 知识点1:raise主动抛出的异常可以被正常捕获 4 def test(number): 5 if number==100: 6 raise ValueError("number不能等于100") 7 return number 8 9 def test1(number): 10 try: 11 return test(number) 12 except ValueError as e: 13 return e 14 15 print(test1(100)) #number不能等于100
1 # coding:utf-8 2 3 # 知识点2:raise语法后面没有进行异常类型的传递,直接跟字符串,编译器报错,必须得加,如果不知道异常类型,使用基类Exception 4 def test(): 5 raise "报错了" 6 7 print(test()) 8 ''' 9 Traceback (most recent call last): 10 File "D:/WorkSpace/Python_Study/test01.py", line 7, in <module> 11 print(test()) 12 File "D:/WorkSpace/Python_Study/test01.py", line 5, in test 13 raise "报错了" 14 TypeError: exceptions must derive from BaseException 15 '''
4.2.自定义异常类
1 # coding:utf-8 2 3 class NumberLimitError(Exception): 4 def __init__(self,message): 5 self.message = message 6 7 class NameLimitError(Exception): 8 def __init__(self,message): 9 self.message = message 10 11 def test(name): 12 if name=="张三": 13 raise NameLimitError("张三不可以被填写") 14 return name 15 16 def test1(number): 17 if number > 100: 18 raise NumberLimitError("数字不能大于100") 19 return number 20 21 try: 22 test("张三") 23 except NameLimitError as e: 24 print(e) 25 ''' 26 张三不可以被填写 27 ''' 28 29 try: 30 test1(105) 31 except NumberLimitError as e: 32 print(e) 33 ''' 34 数字不能大于100 35 '''
5.断言
5.1.断言的功能---assert
assert断言:用于判断一个表达式,在表达式条件为false时触发异常
- raise是生硬的抛出异常
- assert是先进行判断然后根据结果决定是否抛出
5.2.断言得用法---assert
1 # coding:utf-8 2 3 def test(name): 4 assert name in ["张三","李四"],"{}不在学生列表中".format(name) 5 print("{}在学生列表中".format(name)) 6 test("张三") #张三在学生列表中 7 test("王五") 8 ''' 9 Traceback (most recent call last): 10 File "D:/WorkSpace/Python_Study/test01.py", line 7, in <module> 11 test("王五") 12 File "D:/WorkSpace/Python_Study/test01.py", line 4, in test 13 assert name in ["张三","李四"],"{}不在学生列表中".format(name) 14 AssertionError: 王五不在学生列表中 15 '''
6.python中的调试方法
百度上面的方法一大堆,这里我就不多赘述了。