一篇文章带你了解python异常基础
目录
- 1. 程序中的问题
- 1.1 低级语法错误
- 1.2 中介错误:代码存在隐性错误
- 1.3 高级错误:软件面对不确定性的异常错误
- 2. 捕捉异常
- 2.1 基本异常捕捉语句
- 2.2 带finally子句的异常处理
- 2.3 try-except-else 结构
- 2.4 try-except-else-finally 结构
- 2.5 捕捉特定异常信息
- 3. 抛出异常
- 总结
1. 程序中的问题
1.1 低级语法错误
低级错误纯属语法错误,代码主要在编写、调试阶段就报错。
>>> if True SyntaxError: invalid syntax >>>
上述错误是初学时很容易犯的语法错误,True后面缺少冒号(:)。
1.2 中介错误:代码存在隐性错误
隐形错误主要是指代码编写存在逻辑错误或缺陷,当程序满足特定数据处理条件时,报错或给出错误答案。
>>> def print_D(dic): i=0 len1=len(dic) while i < len1: print(dic.popitem()) #随机删除并返回一个元素 i+=1 >>> print_D({1:'a',2:'b'}) (2, 'b') (1, 'a')
上述代码能够正常运行,但是在实际的程序使用过程中,可能另一个程序员传递一个非字典对象后。
>>> print_D([1,2,3,4]) Traceback (most recent call last): File "<pyshell#11>", line 1, in <module> print_D([1,2,3,4]) File "<pyshell#9>", line 5, in print_D print(dic.popitem()) AttributeError: 'list' object has no attribute 'popitem'
错误的传递对象导致了正常程序出错,这就是隐性错误。隐性错误的特点是正常情况下程序正常运行,特殊情况下(如边界值没有考虑到,传入数据没有仔细检查类型等)出错。有些隐性错误甚至不报错,而是由结果输出,这是最糟糕的情况。
1.3 高级错误:软件面对不确定性的异常错误
高级错误指不确定性的错误,主要指软件的代码本身没有问题,所输入的数据也能得到控制或保证,而是在运行过程中环境所带来的不确定性异常。如:
(1)软件本身去尝试打开一个文件,而这个文件已经被破坏或独占(独占指一个进程(线程)处理过程,其他进程(线程)无法同步处理,只能等待这个进程(线程)处理完成,其他进程(线程)才能继续操作)。
(2)软件在往数据库插入数据过程中,突然网络中断,导致数据丢失
(3)软件运行硬件出现故障,导致软件无法正常运行等
(4)数据库系统被破坏,软件读写数据报错
(5)软件输入内容过度复杂或存在错误操作,。
2. 捕捉异常
2.1 基本异常捕捉语句
基本异常捕捉语句语法
try: 代码模块1 except: 代码模块2
try关键字,表示捕捉异常语句的开始;代码模块1,属于正常需要执行的代码模块;except关键字,用于捕捉异常信息,并可以给出出错信息(默认英文提示)。
(1)先执行try语句,代表捕捉异常机制开始
(2)执行代码模块1,若没有出错,忽略except关键字和代码模块2,代码正常执行完毕
(3)若执行代码模块1过程发生异常现象,则终止代码模块1内剩余代码的执行,转到except处
(4)except关键字捕捉到异常信息,并执行代码模块2(往往给出错误信息提示或做出错后问题处理),异常处理结束
示例
>>> def print_D(dic): i=0 try: len1=len(dic) while i < len1: print(dic.popitem()) i+=1 except: print('传递值类型出错,必须为字典类型!') >>> print_D({1:'a',2:'b'}) (2, 'b') (1, 'a') >>> print_D([1,2,3,4]) 传递值类型出错,必须为字典类型! #出错后的正确提示信息
2.2 带finally子句的异常处理
基本格式:
try: 代码模块1 except: 代码模块2 finally: 代码模块3
finally关键字后的代码模块3,运行代码模块1是否出错都会执行的代码功能。
案例 1
>>> try: 1/0 except: print('除数不能为0') finally: print('出现执行结束') >>>
案例 2
>>> try: 1/2 except: print('出书不能为0') finally: print('出现运行结束') >>>
#运行结果
0.5
出现运行结束
案例 3
import sys try: 1/0 except: print('除数不能为0') sys.exit() finally: print('程序执行结束') print('我能执行码?') >>>
#运行结果
除数不能为0
程序执行结束
2.3 try-except-else 结构
结构运行过程:程序进入try语句部分,当try语句部分发生异常则进入except语句部分,若不发生异常进入else语句部分。
try: print("正常代码") except Exception as e: print("将不会输出这句话") else: print("这句话将被输出") print('-'*30) try: print(1/0) except Exception as e: print("进入异常处理") else: print("不会输出") >>>
#运行结果
正常代码
这句话将被输出
------------------------------
进入异常处理
2.4 try-except-else-finally 结构
try: print("没有异常") except Exception as e: print("不会输出!") else: print("进入else") finally: print("必须输出!") print('-'*30) try: print(1/0) except Exception as e: print("引发异常") else: print("不会进入else") finally: print("必须输出!") >>>
# 运行结果
没有异常
进入else
必须输出!
------------------------------
引发异常
必须输出!
2.5 捕捉特定异常信息
3. 抛出异常
python允许程序员自己触发异常,可以通过raise关键字来实现,使用格式:
raise [Exception]
Exception参数可选,其对象如上表所示的Exception类的子类。
示例一:不带参数的触发
>>> raise Traceback (most recent call last): File "<pyshell#52>", line 1, in <module> raise RuntimeError: No active exception to reraise >>>
代码通过raise子句抛出一个没有问题的异常信息。
示例二:带参数的触发
>>> i='1' >>> if type(i)!=int: raise TypeError('i类型出错!') Traceback (most recent call last): File "<pyshell#57>", line 2, in <module> raise TypeError('i类型出错!') TypeError: i类型出错! >>>
总结
本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我们的更多内容!