Python基础(十)异常处理

Python基础(十)

1、错误与异常处理

1.1、异常的概念

有时候代码存在缺陷,在执行程序的时候,执行到错误代码的时候,程序直接停止或抛出报错, 这是因为Python检测到一个错误时, 解释器就无法继续执行了, 出现了错误的提示,这样的现象就是"异常"。

1.2、语法结构

最基础的捕获可以直包含try与except对异常进行处理,else与finally可以按实际情况添加

try:
    < 代码块 >
except < 异常名1 >:
    print('异常说明1')
except < 异常名2 >:
    print('异常说明2')
else:
    < 代码块 >  # try语句中没有异常则执行此段代码
finally:
    print("finally")  # 无论是否发生异常都将会执行最后的代码

1.3、try…except

1. 捕获指定的异常

try:
    print(a)
except NameError as msg:
    print(msg)

print("666")

2. 捕获多个异常

try:
 fp = open("123.txt","r") # 程序出现异常,不会继续执行后面的代码
 print("hello world")
 fp.close()
except GeneratorExit:
 print("异常说明:GeneratorExit")
except FloatingPointError:
 print("异常说明:FloatingPointError")

3. 捕获所有异常

try:
 x = 3 / 0 # 程序出现异常,不会继续执行后面的代码
 print("hello world")
except:
 print("异常说明:分母不能为0")

1.4、else

如果判断在代码执行过程中没有异常的情况下执行其他的代码块,就可以使用else语句。

try:
    print("aa")
except NameError as msg:
    print(msg)
except Exception as msg:
    print(msg)
else:
    print("无错")
print("666")

1.5、finally

无论什么情况都将会执行finally里的代码块

try:
    print(aa)
except NameError as msg:
    print(msg)
except Exception as msg:
    print(msg)
else:
    print("无错")
finally:
    print("finally")
print("666")

1.6、raise

主动触发异常

try:
    raise Exception("raise Exception!")  # 触发异常后,后面的代码就不会再执行
    print("hello world")
except Exception as e:
    print(e)
finally:
    print("OK")

1.7、自定义异常

在开发的过程中可能会出现现有的异常类型不满足个人的开发需求,这是就可以自定义异常。

自定义异常,都要直接或间接继承Error或Exception类。

由开发者主动抛出自定义异常,在python中使用raise关键字。

1. 定义自定义异常

  1. 定义一个类,直接或间接继承Error或Exception类
  2. 根据需求编写init方法
  3. 编写str方法,显示出错信息。以便于后期调整。

示例:

class MyException(Exception):
    def __init__(self, leng):
        self.leng = leng

    def __str__(self):
        print("长度是" + str(self.leng) + ",超过长度了")

2. 抛出捕获自定义异常

class MyException(Exception):
    def __init__(self, leng):
        self.leng = leng
        pass

    def __str__(self):
        return ("长度是" + str(self.leng) + ",超过长度了")
        pass

    pass


def name_Test():
    name = input("your name:")
    try:
        if len(name) > 4:
            raise MyException(len(name))  # 抛出异常很简单,使用raise即可,但是没有处理,即捕捉
        else:
            print(name)
    except MyException as msg:
        print(msg)
    finally:
        print("okk")


# 调用函数,执行
name_Test()
print("结束")

1.8、异常讲解

1. 异常的捕获

  • 将可能出错的代码放到try里面,except可以指定类型捕获异常。
  • except里面的代码是捕获到异常时执行,将错误捕获,这样异常就不会导致解释器处理异常而导致整个程序崩溃。

2. 捕获多个或通用异常

  • 一个try块可以捕获多个异常,每一个except可以代表一种异常。
  • except如果指定了异常名就只会捕捉指定的异常,如果没有指定就会捕捉全部的异常。
  • 不指定捕获异常名或指定为 Exception都可以捕获到全部的异常。

3. 异常的抛出机制

  • 在运行时发生异常解释器会查找相应的异常捕获类型,如果在当前函数里面没有找到的话,它会将异常传递给上层的调用函数,看能否处理如果在最外层没有找到的话,解释器就会异常退出
  • 所以说当有多层嵌套函数时,可以在最顶层捕获其余层的错误类型

1.9、常见的异常

BaseException — 所有异常的基类

SystemExit — 解释器请求退出

KeyboardInterrupt — 用户中断执行(通常是输入^C)

Exception — 常规错误的基类

StopIteration — 迭代器没有更多的值

GeneratorExit — 生成器(generator)发生异常来通知退出

StandardError — 所有的内建标准异常的基类

ArithmeticError — 所有数值计算错误的基类

FloatingPointError — 浮点计算错误

OverflowError — 数值运算超出最大限制

ZeroDivisionError — 除(或取模)(所有数据类型)

AssertionError — 断言语句失败

AttributeError — 对象没有这个属性

EOFError — 没有内建输入,到达EOF 标记

EnvironmentError — 操作系统错误的基类

IOError — 输入/输出操作失败

OSError — 操作系统错误

WindowsError — 系统调用失败

ImportError — 导入模块/对象失败

LookupError — 无效数据查询的基类

IndexError — 列中没有此索引(index) 下标越界

KeyError — 映射中没有这个键

MemoryError — 内存溢出错误(对于Python 解释器不是致命的)

NameError — 未声明/初始化对象 (没有属性)

UnboundLocalError — 访问未初始化的本地变量

ReferenceError — 弱引用(Weak reference)试图访问已经垃圾回收了的对象

RuntimeError — 一般的运行时错误

NotImplementedError — 尚未实现的方法

SyntaxError — Python 语法错误

IndentationError — 缩进错误

TabError — Tab 和空格混用

SystemError — 一般的解释器系统错误

TypeError — 对类型无效的操作

ValueError — 传入无效的参数

UnicodeError — Unicode 相关的错误

UnicodeDecodeError — Unicode 解码时的错误

UnicodeEncodeError — Unicode 编码时错误

UnicodeTranslateError — Unicode 转换时错误

Warning — 警告的基类

DeprecationWarning — 关于被弃用的特征的警告

FutureWarning — 关于构造将来语义会有改变的警告

OverflowWarning — 旧的关于自动提升为长整型(long)的警告

PendingDeprecationWarning — 关于特性将会被废弃的警告

RuntimeWarning — 可疑的运行时行为(runtime behavior)的警告

SyntaxWarning — 可疑的语法的警告

UserWarning — 用户代码生成的警告

2、小结

  • 错误与异常处理
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值