异常处理
一、异常处理
1、异常概念
异常是程序执行力过程中出现的非正常的流程项目。
异常是无法避免的,只能先预估出可能出现的异常现象,并提供对应的处理机制,在异常出现后保障程序不被中断执行。
2、异常处理的基本语法
格式一(常用):
try:
可能引发异常现象的代码
except:
出现异常现象的处理代码
try:
print(a) # 可能引发异常现象的代码
except:
print("变量a未定义") # 出现异常现象的处理代码
格式二(不常用):
try:
可能引发异常现象的代码
finally:
try代码块结束后运行的代码
格式三(完整格式):
try:
可能引发异常现象的代码
except:
出现异常现象的处理代码
else:
未出现异常现象的处理代码
finally:
try代码块结束后运行的代码
3、异常精细化处理
异常处理可以根据不同种类的异常进行不同的处理方案设计,使用异常名称来进行区分。标准格式如下:
except 异常类名1 as 变量名:
出现异常现象的处理代码
except 异常类名2 as 变量名:
出现异常现象的处理代码
except 异常类名3 as 变量名:
出现异常现象的处理代码
except Exception as 变量名:
出现异常现象的处理代码
try:
c = 0
b = a /c
print("b")
except NameError as error: # 通过异常类名后面的变量名可以获取到具体异常信息
print("a没有被定义:"+ str(error))
except ZeroDivisionError as error:
print("被除数不能为零"str(error))
except Exception as error:
print("未知错误"str(error))
上段代码执行结果:
a没有被定义:name 'a' is not defined
说明:
- 1.通过异常类名后面的变量名可以获取到具体异常信息
- 2.执行了某个except中的内容后,其他except中的内容将不再执行
- 3.Exception类是所有异常类的父类,能够拦截所有的异常现象,通常设置成最后一级的捕获
4、异常对象主动抛出
异常对象可以使用主动抛出的形式来构造,语法格式:
raise 异常对象
if y == 0:
raise ZeroDivisionError("被除数不能为零")
5、异常处理传递
异常出现后如果没有被捕获处理,该异常将会继续向下传递,到下一次调用位置。
情况一:使用 try 嵌套处理
"""使用 try 嵌套处理,先处理内层的异常,处理完后再处理外层异常"""
try:
try:
c = 0
b = a /c
print("b")
except NameError as error:
print("a没有被定义:"+ str(error))
except ZeroDivisionError:
print("被除数不能为零")
except Exception:
print("未知错误")
情况二:函数、/方法调用,在任意位置处理
"""最后调用处理"""
def oper1():
print( 1 / 0 )
def oper2():
oper1()
def oper3():
oper2()
try:
oper3()
except:
print("处理")
"""中间调用处理"""
def oper1():
print( 1 / 0 )
def oper2():
try:
oper1()
except:
print("处理掉")
def oper3():
oper2()
oper3()
二、自定义异常
1、自定义异常基本语法
class 自定义异常类名(Exception):
pass
2、自定义异常主动触发
raise 异常类对象
案例:用户登录信息校验
"""
案例:用户登录信息校验
要求:
用户输入用户名,密码后对信息进行校验
1.用户名长度在3-8个字符
2.用户名中只能出现英文字母和数字
3.密码长度必须是6位
4.密码必须由纯数字组成
分析:
1.信息使用input操作获取
2.定义自定义异常,描述非法信息
3.提供检测的函数,针对情况进行处理
4.执行程序中要使用try结构完成检测
"""
class NameError(Exception):
pass
class PwdError(Exception):
pass
def login(name,password):
if not 3<= len(name) <= 8:
raise NameError("用户名长度必须在3到8之间")
if not name.isalnum():
raise NameError("用户名必须由字母和数字组成")
if len(password) != 6:
raise PwdError("密码的长度必须等于6位")
if not password.isnumeric():
raise PwdError("密码必须由纯数字组成")
name = input("请输入用户名:")
password = input("请输入密码:")
try:
login(name, password)
except NameError as error:
print(str(error))
except PwdError as error:
print(str(error))
else:
print("信息无误,可以正常使用")