异常处理
一、简介
1. 异常处理是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况.
2. 异常是程序执行过程中,发生了某种‘错误’,影响程序的正常运行. Python程序在执行前有可能会发生语法错误,也会导致程序无法正常执行。
- 运行时错误
- 语法错误
3. 异常处理的目的:通过异常处理,我们可以对程序中出现的意外情况进行处理,防止程序崩溃,增加程序的健壮性
在编程语言处理异常:
1. 使用if判断进行处理
a = 5
b = 0
if b != 0:
print(a / b)
else:
print('除数不能为0')
2. 使用try块处理
a = 5
b = 0
try:
print(a/b)
except:
print('除数不能为0')
# if更适合用于一些可以预判的一种异常情况,但是if不可能把所有的异常情况都判断到,有些异常是我们无法预知
二、常见的异常
异常分类:(1)语法错误 (2)运行时错误
1. NameError: 名字异常
变量未定义,直接去使用 NameError: name 'a' is not defined
2. IndentationError: 缩进错误
在同一个代码块中,使用了不同的缩进
3. SyntaxError:语法错误
1a = 5 变量名不能以数字开头
4. TypeError: 类型错误
print(1+'1') 字符串和Int类型不能直接相加
5. ZeroDivisionError:除数为零错误
10/0 ZeroDivisionError: division by zero
6. FileNotFoundError: 文件未找到错误
读文件时,文件不存在
7. StopIteration:迭代器异常
next()调用次数超过了元素的个数
8. KeyError:键错误
访问字典不存在的键 d[key]
9. ValueError: 值错误
print(int('abc')) 将字符串强制转为int
10. AttributeError:属性错误
访问对象中不存在的属性或方法时
11. indexError:下标(越界)异常
下标超出范围
12. RecursionError:递归异常
递归超过最大深度
以上的异常类型都是由类定义的
13. Exception: 常见的错误异常的基类(父类)
14. BaseException:所有异常的基类
三、处理异常
一般情况下,Python无法正确处理/执行程序时,就会发生(抛出)一个异常.
异常是一个对象,表示一个错误.
当Python程序发生异常时,我们就需要捕获并处理它,否则程序会终止执行(崩溃).
1. try-except
try:
可能出现异常的代码
except:
所有的异常都会在这里处理(全捕获)
try:
可能出现异常的代码
except 异常类型 as 变量名:
只有匹配异常类型时,才会执行except (精准匹配)
# 注意:如果发生了异常,异常后面的代码不会被执行
try:
10/0
print('go on') # 这行代码不会被执行
except:
xxx
示例:
# 全匹配
try:
10/0
# print([][1])
except :
print('发生了错误')
# 精准匹配
try:
10/0
# print([][1])
except IndexError as e:
print('发生了错误')
2. try-except-except
try:
可能出现异常的代码
except 异常类型1 as e:
该类型的异常处理
except 异常类型2 as e:
另一种类型的异常处理
except:
xxx
# 注意:通用性最高的要放最后面,匹配性最高的要放最前面
try:
10/0
# print([][1])
# print(int('abc'))
except Exception as e: # 这里的except往后放 通用性强
print('发生下标越界错误',e)
except ZeroDivisionError as e:
print('发生了除数为零的错误',e)
except:
print('未知类型的异常')
# 多个except后面接异常类型
try:
# 10/0
print([][1])
except IndexError as e:
print('发生下标越界错误',e)
except ZeroDivisionError as e:
print('发生了除数为零的错误',e)
# 在最后,加except不加异常类型:用于匹配其它情况(相当于if..elif..elif..else中的else)
try:
# 10/0
# print([][1])
print(int('abc'))
except IndexError as e:
print('发生下标越界错误',e)
except ZeroDivisionError as e:
print('发生了除数为零的错误',e)
except:
print('未知类型的异常')
3. try-except-except-else
try:
可能出现异常的代码
except Exception as e:
print(e)
else:
print('如果没有发生异常则执行else')
示例:
import traceback
try:
# 可能出现异常的代码
a = int(input('输入a:'))
b = int(input('输入b:'))
print(a / b)
except:
print('出错了')
traceback.print_exc()
else:
print('这是else')
4. try-except-except-finally
- 不论代码是否出现异常,都会执行finally
import traceback
try:
a = int(input('输入a:'))
b = int(input('输入b:'))
print(a / b)
except:
traceback.print_exc()
finally:
print('最终~~~~')
四、自定义异常
class MyException(BaseException):
def __init__(self, msg):
self.__msg = msg
def __str__(self):
return self.__msg
try:
a = int(input('输入a:'))
b = int(input('输入b:'))
if b == 1:
# 什么时候抛出异常,以及什么是异常由程序员来决定
raise MyException('除数不允许为1')
else:
print(a / b)
except MyException as e:
print(e)