异常处理格式(else和finally可省略)
try:
path1(可能发送异常的部分)
except:
path2
else:
path3
finally:
path4
如果没发送异常,执行path1, path3, path4
如果发送异常,执行异常之前的部分以及path2, path4
举例:
try:
print('path 1')
open('a.txt', 'r')
print('path 2')
except:
print('path 3')
else:
print('path 4')
finally:
print('path 5')
输出:发送异常输出(open发送异常,没有a.txt文件):
path 1
path 3
path 5
举例:
try:
print('path 1')
#open('a.txt', 'r')
print('path 2')
except:
print('path 3')
else:
print('path 4')
finally:
print('path 5')
输出:没有异常输出
path 1
path 2
path 4
path 5
异常类型 | 含义 | 举例 |
---|---|---|
NameError | 使用没有定义的变量 | |
TypeError | 操作或函数应用于不适当类型的对象 | a = 1 + ‘b’ |
ValueError | 操作或函数的参数具有正确的类型但不合法 | int(‘ab’) |
KeyError | 访问字典中不存在的键 | |
ZeroDivisionError | 除数为0时触发 | a = 2 / 0 |
IOError | 读取不存在或无法访问的文件 | |
ImportError | 导入不存在的模块或包 | |
AttributeError | 访问的对象不存在的属性 | |
KeyboardInterrupt | 用户中断程序执行时发生 | |
SyntaxError | 语法错误异常 | |
IndexError | 索引异常 |
在使用异常类型捕获异常的时候,异常的类型需要和可能发送异常的类型对得上,不然还是会抛出异常
带异常类型的格式
当不知道错误类型时使用Exception代替所有错误类型
try:
print('可能出现异常的代码')
f = open('a.txt', 'r')
except Exception as e:
print('发生异常时执行')
print(e)
else:
print('当没有出现异常时执行')
print(f.read())
finally:
print('无论是否出现异常,都会执行')
# 这个模块一般用于资料关闭或回收,如文件关闭,网络连接关闭,数据库关闭
f.close()
单一异常处理格式
try:
a = 1 / 0
except ZeroDivisionError:
print('除数不能为0')
多个异常处理格式
try:
path1
except TypeError as e:
print(e)
except ValueError as e:
print(e)
except:
path4
多个异常合并处理格式
try:
path1
except (TypeError, ValueError) as e:
print(e)
except:
path4
下面自己自定义一个判断手机号位数是够合法的异常类,如果不合法,则抛出异常
# 自定义异常类
class PhoneNumberNotDigitError(Exception):
def __init__(self, msg):
self.__msg = msg
def __str__(self):
return self.__msg
# 定义一个用来判断手机号位数是否合法的异常类
class PhoneNumberLengthError(Exception):
def __init__(self, msg):
self.__msg = msg
def __str__(self):
return self.__msg
# 抛出异常
def get_phone_number():
pn = input('请输入手机号')
if pn.isdigit() == False:
# 抛出异常
raise PhoneNumberNotDigitError('手机号不合法')
elif len(pn) != 11:
raise PhoneNumberLengthError('手机号位数不对')
print('输入的手机号合法')
# 捕获异常
try:
num = get_phone_number()
except (PhoneNumberLengthError, PhoneNumberNotDigitError) as e:
print(e)
else:
print(num)