7.异常处理

异常处理

一、认识异常

1.异常本身就是异常类的实例

try:将可能会发生异常的代码放在try中,进行尝试性执行

except:except用来捕获异常,并进行响应的处理

else:else在没有异常的时候会执行

finally:finally不管是否有异常,都会执行

2.Python的异常结构(基于继承)

在 Python 中所有的异常都是继承自 BaseException ,直接分为四大类:

SystemExit:Python退出异常
KeyboardInterrupt: 键盘打断(Ctrl+C)
GeneratorExit: 生成器退出
Exception: 普通异常(代码只会出现这部分的异常)

3.查找报错原因

查看:报错原因+报错行+执行的代码

二、异常处理

1.基本的 try…except…

# 基本语法
try:
    先执行,异常,捕获异常,执行 except 里面的代码
    先执行,无异常,不再执行 except 里面的代码
except:
    捕获异常时,执行的功能块

例:

try:
    a = 5 - b		# NameError: name 'b' is not defined
except:
    print("发生了异常")
print("继续执行")
**********************************************************************
发生了异常
继续执行

2.捕获具体的异常

捕获到想要捕获的异常,处理

try:
    1/0       # ZeroDivisionError: division by zero
except ZeroDivisionError:
    print("发生了异常")
print("继续执行")
**********************************************************************
发生了异常
继续执行

没有捕获到想要捕获的的异常,正常抛出异常

try:
    1/0       # ZeroDivisionError: division by zero
except NameError:
    print("发生了异常")
print("继续执行")
**********************************************************************
ZeroDivisionError: division by zero

3.捕获多种异常

关于 Exception 及其子类的解释:

代码中会出现的异常都是 Exception 的子类, 因此在 except 中只需要在最后加上 Exception 即可

在抛出异常的过程中,会从上到下依次对比异常,找到之后就不会再往后查找

try:
    5 - "a"           # TypeError: unsupported operand type(s) for -: 'int' and 'str'
except NameError:
    print("NameError")
except ZeroDivisionError:
    print("ZeroDivisionError")
except TypeError:
    print("TypeError")
except Exception:
    print("Exception")
print("继续执行")
**********************************************************************
TypeError
继续执行

4.查看异常描述

try:
    5 - "a"           # TypeError: unsupported operand type(s) for -: 'int' and 'str'
except NameError:
    print("NameError")
except ZeroDivisionError:
    print("ZeroDivisionError")
except TypeError as e:
    print("TypeError")
    print(e)
except Exception:
    print("Exception")
print("继续执行")
**********************************************************************
TypeError
unsupported operand type(s) for -: 'int' and 'str'
继续执行

5.else 与 finally

# else: 有异常时不执行,无异常时执行
# finally: 有无异常时,都执行

例:有异常

try:
    a = 5 - b        # NameError: name 'b' is not defined
except:
    print("发生了异常")
else:
    print("else")
finally:
    print("finally")
********************************************************************** 
发生了异常
finally

例:无异常

try:
    a = 5
except:
    print("发生了异常")
else:
    print("else")
finally:
    print("finally")
**********************************************************************
else
finally

6.raise (主动抛出异常)

try:
    raise TypeError("主动抛出的异常错误")
except TypeError as a:
    print("类型错误")
    print(a)
except FileNotFoundError as b:
    print("文件错误")
    print("b")
except Exception as c:
    print("其他异常错误")
    print(c)
**********************************************************************
类型错误
主动抛出的异常错误

实际应用

def func(name):
    if name == "zzh":
        raise TypeError("黑名单用户,拒绝访问")

func("zzh")
**********************************************************************
TypeError: 黑名单用户,拒绝访问

自定义异常类型

class BleaklistError(Exception):
    pass

def func(name):
    if name == "zzh":
        raise BleaklistError("黑名单用户,拒绝访问")
    else:
        print("欢迎访问")

func("zzh")
**********************************************************************
__main__.BleaklistError: 黑名单用户,拒绝访问

7.常见异常类型

异常名解释
AttributeError试图访问一个对象没有的属性
IOError输入/输出异常
ImportError无法引入模块或包;多是路径问题或名称错误
IndentationError缩进错误
IndexError下标索引错误
KeyError试图访问不存在的键
KeyboardInterruptCtrl+C被按下,键盘终止输入
NameError使用未定义的变量
SyntaxError语法错误
TypeError传入对象的类型与要求的不符合
UnboundLocalError试图访问一个还未被设置的局部变量
ValueError传入一个调用者不期望的值,即使值的类型是正确的
OSError操作系统执行错误

三、断言 assert

1.概念

断言主要用于代码调试,其实可以用print()方法代替

语法:assert 条件

  • 条件不满足时,抛出AssertionError异常,后续程序终止
  • 条件满足时,正常执行

2.举例

条件不满足

a = 1
b = 2
print(a > b)        # False
print(a < b)        # True

assert a > b
print("ok")
**********************************************************************
False
True
AssertionError

条件满足

a = 1
b = 2
print(a > b)        # False
print(a < b)        # True

assert a < b
print("ok")
**********************************************************************
False
True
ok
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值