异常概述
异常: 不正常
程序在执行过程中发生了不可预知的问题.
导致程序崩溃
NameError
TypeError
ValueError
AttribitueError
SyntaxError
IndexError
改- index()
1. 异常的基本格式
try:
可能会出现异常问题的代码
except Exception as e:
当出现异常时,解决异常的代码
else:
当没有出现异常时,正常执行的代码
finally:
无论是否出现异常,都会执行这里的代码
语法糖
with open('a.txt','r') as f:
f.read()
1. 简单处理
# class 语法错误 (Exception)
#
# class 简单语法错误 (语法错误)
# 没有缩进
# 使用全角符号
#
# 高级语法错误
# 逻辑性错误
**2.使用 try-except 进行基本的异常处理**
s = 'Hello'
try:
# 这句代码会发生异常
print(s.index('O'))
# except ValueError:
except Exception:
print('查找的子串不存在')
# 使用Try 来尝试执行 后面语句 块中的代码 ,如果代码 发生异常问题
# 那么异常信息就会被 except 捕捉到,可以在 except 后面进行异常处理
# 如果代码 没有异常,那么程序就正常运行,不会执行except 后的代码
print('over')
2. 异常的传递
当代码出现了很层级的调用时,在其中发生了异常,如果没有处理这个异常,这个异常会自动向上抛出
如果上层也没有处理,那么再继续向上抛出,直到抛到解释器,解释器默认处理异常的方式就是中断程序,
将异常信息显示控制台上
异常的传递
在发生异常时,异常的发生点可能在很深的函数调用过程中,这时如果不处理异常的话,异常会被一层一层的抛出
如果谁都没有处理,最终抛给解释器,解释是没办法处理异常,解释会将异常信息显示到终端
'''
异常的传递
'''
def func_a():
print('Func a run ...')
func_b()
def func_b():
print("Func b run ...")
try:
func_c()
except Exception:
print('你的除数为0了')
def func_c():
print('Func c run ...')
# try:
# print(1 / 0)
# except Exception:
# print('你的除数为0了')
print(1 / 0)
func_a()
6. 异常处理
语法:
try:
可能出现异常的代码
except Exception:
当异常发生时,处理异常的代码
7. 多个异常的处理
将多个异常通过圆括号包裹成一个元组
语法:
try:
可能出现异常的代码
except (异常1,异常2,...):
当异常发生时,处理异常的代码
7-1: 异常别名-获取异常信息
语法:
try:
可能出现异常的代码
except (Exception,… )as e:
print(e)
当异常发生时,处理异常的代码
'''
注意:同时捕捉多个异常,但是同一时刻只能有一个异常发生
'''
try:
# n = 1
n / 0
# except (ZeroDivisionError,NameError) as e:
# except Exception as e:
except :
print('出现异常了')
8. else:(可选的,理解)
在异常处理时,当没有异常发生的情况后,需要执行的代码,放到 else 语句块
9. finally:(可选的,掌握)
无论异常是否发生,都会执行这个语句块里的内容
应用:
一般应用在资源需要关闭资源的场景上
比如:文件的关闭,网络连接的关闭,数据库的关闭
'''
异常处理子句,else 用来处理没有异常的的情况
'''
try:
f = None
f = open('b.txt','r')
except Exception as e:
print('要打开的文件不存在')
print(e)
else:
# 对文件的读取操作
print('else 是当没有出现异常时,执行的else语句 块')
print(f.read())
finally:
# 不管是否出现异常,都要执行这个语句块
# 一般这个模块中,主要写的内容 是资料关闭或回收
# 比如,文件的关闭,网络连接的关闭,数据库的关闭
print('无论是否出现异常,都会执行finally语句 块')
if f != None:
f.close()
with open('a.txt','r') as f:
print(f.read())
11. 自定义异常
格式:
class 异常名Error(Exception):
def __init__(self,msg=''):
self.__msg = msg
def __str__(self):
return self.__msg
class CustomError(Exception):
pass
'''自定义异常
格式 :
class 异常名Error(Exception):
pass
'''
# 定义一个用来判断当前手机号是否有非法字符的异常
class PhoneNumberNotDigitError(Exception):
pass
# 定义一个用来判断手机号位数是否合法的异常
class PhoneNumberLengthError(Exception):
def __init__(self,msg):
self.__msg = msg
def __str__(self):
return self.__msg
# 定义一个函数,用来获取一个电话号码
def get_phone_number():
pn = input('请输入一个11位的手机号:')
if pn.isdigit() == False:
# 抛出自定义的异常
raise PhoneNumberNotDigitError()
elif len(pn) != 11:
raise PhoneNumberLengthError('手机号位数不正确')
return '输入的手机号是合法的:' + pn
12. 自定义异常的抛出
raise 异常对象
raise 类名
raise 类名()
from p_16自定义异常 import *
try:
num = get_phone_number()
except (PhoneNumberLengthError, PhoneNumberNotDigitError) as e:
print(e)
else:
print(num)