python 基础之异常处理

346 阅读4分钟

异常处理

一、异常处理

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("信息无误,可以正常使用")