python学习笔记(6)——异常的处理

目录

一、Exception类内置异常

二、异常捕获语句

2.1使用try-except语句捕捉异常

1.捕获单个异常

2.捕获多个异常

3.捕获全部异常

2.2 异常结构中的else子句

2.3 异常结构中的finally子句

三、抛出异常

3.1使用raise语句抛出异常

1.使用异常类引发异常

2.使用异常类对象引发异常

3.重新引发异常

3.2 使用assert语句抛出异常

四、自定义异常


       

        当程序运行出现异常时,若程序中没有设置异常处理功能,解释器会采用系统默认的方式处理异常,即返回异常信息终止程序。异常信息通常包含异常代码所在的行号、异常的类型和异常的描述信息。

一、Exception类内置异常

BaseException             所有异常的基类         
SystemExit              解释器请求退出
KeyboardInterrupt          用户中断执行(通常是输入^C)
GeneratorExit            生成器(generator)发生异常来通知退出
Exception               常规错误的基类
StopIteration              迭代器没有更多值 
StopAsyncIteration              必须通过异步迭代器对象的__anext__()方法引发以停止迭代
ArithmeticError                 所有数值计算错误的基类
FloatingPointError             浮点计算错误
OverflowError                  数值运算超出最大限制
ZeroDivisionError              除(或取模)零 (所有数据类型
AssertionError                  断言语句失败
AttributeError                  对象没有这个属性
BufferError                    与缓冲区相关的操作时引发
EOFError                        没有内建输入,到达EOF 标记
ImportError                     导入失败
ModuleNotFoundError        找不到模块
LookupError                     无效数据查询的基类
IndexError                      序列中没有此索引(index)
KeyError                        映射中没有这个键
MemoryError                     内存溢出错误
NameError                       未声明、初始化对象
UnboundLocalError              访问未初始化的本地变量
OSError                         操作系统错误,
BlockingIOError               操作将阻塞对象设置为非阻塞操作
ChildProcessError             子进程上的操作失败
ConnectionError               与连接相关的异常的基类
BrokenPipeError             在已关闭写入的套接字上写入
ConnectionAbortedError      连接尝试被对等方中止
ConnectionRefusedError      连接尝试被对等方拒绝
ConnectionResetError        连接由对等方重置
FileExistsError               创建已存在的文件或目录
FileNotFoundError             请求不存在的文件或目录
InterruptedError              系统调用被输入信号中断
IsADirectoryError             在目录上请求文件操作
NotADirectoryError            在不是目录的事物上请求目录操作
PermissionError              在没有访问权限的情况下运行操作
ProcessLookupError            进程不存在
TimeoutError                  系统函数在系统级别超时
ReferenceError                弱引用试图访问已经垃圾回收了的对象
RuntimeError                  一般的运行时错误
NotImplementedError      尚未实现的方法
RecursionError           解释器检测到超出最大递归深度
SyntaxError                   Python 语法错误
IndentationError         缩进错误
TabError          Tab 和空格混用
SystemError              一般的解释器系统错误
TypeError               对类型无效的操作
ValueError              传入无效的参数
UnicodeError             Unicode 相关的错误
UnicodeDecodeError     Unicode 解码时的错误
UnicodeEncodeError     Unicode 编码时错误
UnicodeTranslateError  Unicode 转换时错误
Warning                       警告的基类
DeprecationWarning          关于被弃用的特征的警告
PendingDeprecationWarning   关于构造将来语义会有改变的警告
RuntimeWarning           可疑的运行行为的警告
SyntaxWarning            可疑的语法的警告
UserWarning              用户代码生成的警告
FutureWarning            有关已弃用功能的警告的基类
ImportWarning            模块导入时可能出错的警告的基类
UnicodeWarning           与Unicode相关的警告的基类
BytesWarning             bytes和bytearray相关的警告的基类
ResourceWarning           与资源使用相关的警告的基类

二、异常捕获语句

        python可以通过try-except语句中实现简单的异常捕捉与处理过程,也可以将try-except语句与else或finally字句进行结合。

2.1使用try-except语句捕捉异常

语法格式:

try:

        可能出错的代码

except[异常类型[as erroe]];

        捕获异常后的处理代码

        以上格式中try子句之后为可能存在出错的代码,也就是需要被监控的代码:在except子句中可以指定异常类型,若指定了异常类型,该子句只对异常类型相互匹配的异常进行处理,否则处理try语句中捕获的所有异常;except子句中的as关键字用于将捕获到的异常对象赋给error;except子句红的代码时处理异常时执行的代码。

        try-except语句的执行过程为:优先执行try子句中可能出错的代码。若try子句中没有出现异常,忽略except子句继续向下执行;若try子句中出现异常,忽略try子句的剩余代码,转而执行except子句;若程序出现的异常类型与except子句中指定的异常类型匹配,使用error记录异常消息,执行except子句中的代码,否则按照系统默认终止程序。

 1、捕获单个异常

捕获单个异常通常时指在except之后指定捕获的单个异常类型即可

如以下代码:

num_one =int (input("请输入被除数:"))
num_two =int (input("请输入除数:"))
try:
    print("结果为:",num_one/num_two)
except ZeroDivisionError:
    print("输入错误")

运行结果:

         以上代码表示当try子句中捕获到第2个整数相除可能出现异常,由于变量num_two具有不确定性,可能导致程序引发ZeroDivisionError异常;except子句中且明显的捕获到ZeroDivisionError异常数据,故程序只有在捕获到ZeroDivisionError异常后才执行except子句中的打印语句。

2.捕获多个异常

        捕获多个异常需要在except之后以元组的形式指定多个异常类型。

示例代码:

num_one =int (input("请输入被除数:"))
num_two =int (input("请输入除数:"))
try:
    print("结果为:",num_one/num_two)
except (ZeroDivisionError,ValueError)as error:
    print("输入错误,错误原因为:",error)

运行结果:

         稍微修改捕获单个异常的代码。以上代码的try子句在执行除法运算时,可能会因为除数为0使程序引发ZeroDivisionError异常,因为可能会因为使用非数值p引发ValueError异常。except子句中明确了捕获ZeroDivisionError或ValueError异常,因此程序在检测到ZeroDivisionError或ValueError异常时会执行except子句中的打印语句。

3.捕获全部异常

        如果要捕获程序中的所有异常,那么可以将except之后的异常类型设置为Exception或神略不屑。需要主义的是,若省略异常类型,except子句中无法获得异常的具体信息,

将上述代码优化:

num_one =int (input("请输入被除数:"))
num_two =int (input("请输入除数:"))
try:
    print("结果为:",num_one/num_two)
except Exception as error:
    print("输入错误,错误原因为:",error)

2.2 异常结构中的else子句

        else子句可以与try-except语句组合起来,若try监控的代码没有异常,程序会执行else子句后的代码。其语法格式如下:

try:

        可能出错的代码

except[异常类型[暗示error]];

        捕获异常后的处理代码

ekse:

        没有异常的处理代码

示例代码:

num_one =int (input("请输入被除数:"))
num_two =int (input("请输入除数:"))
try:
    res = num_one/num_two
except ZeroDivisionError as error:
    print("输入错误:",error)
else:
    print(res)

运行结果:

 2.3 异常结构中的finally子句

语法结构:

try:

        可能出错的代码

except[异常类型[暗示error]];

        捕获异常后的处理代码

finally:

        一定执行的代码

三、抛出异常

3.1使用raise语句抛出异常

rasie <异常类>      #使用异常类名引发指定异常
rasie <异常类对象>      #使用异常类的对象引发指定异常
rasie              #使用刚刚出现过的异常重新引发异常

1.使用异常类引发异常

        在语句执行时会先隐式地创建该语句中异常类的示例,然后才能引发异常

2.使用异常类对象引发异常

        通过raise之后写入一个创建异常类对象,创建类异常对象海通过字符串指定下一场的具体信息。

3.重新引发异常

        使用不带任何参数的”raise“语句,示例代码如下:

try:
    raise IndexError('索引下标超出范围')
except:
    raise

运行结果:

        以上示例中try语句执行后会出现应raise语句引发的IndexError 异常,except子句会被执行,except子句后的代码又会使用raise语句抛出刚刚发生的IndexError异常,最终该程序因为再次抛出异常而终止执行。

3.2 使用assert语句抛出异常

assert语句又称断言语句语法格式如下;

assert 表达式  [,异常信息]

        assert语句中后面紧跟着一个表达式,表达式的值为False时触发AssertionError的异常,值为Ture时不做任何操作,表达式之后可以使用字符串类描述异常信息。

示例代码:

num_one =int (input("请输入被除数:"))
num_two =int (input("请输入除数:"))
assert num_two !=0,'除数不能为0'
result = num_one/num_two
print(num_one,'/',num_two,'=',result)

 运行结果:

        以上代码实现会接受到用户输入的2个数num-one和num-two,并将 num-one和num-two分别作为被除数与·除数,然后使用assert语句判断num-two不等于0,若不等于0则进行除法运算,否则会引发AssertionError异常,并对其做出提醒输出结果。

四、自定义异常

        代码举例:

class ShortInputError(Exception):
    def _init_(self,length,atleast):
        self.lenght=lenght  #设置密码长度
        self.atleast=atleast #限制密码长度
try:
    text = input("请输入密码:")
    if len(text)<3:
        raise ShortInputError(len(text),3)
except ShortInputError as result:
    print("ShortInputError:输入长度为%d,长度至少应为%d"%
        (result,length,result,atleast))
else:
    print("密码设置成功")

运行结果:

         以上代码首先定义了一个继承Exception的ShortInputError类,并在ShortInputError中添加了两个属性length和atleast,其中length表示用户实际输入的密码长度,atleast表示程序限制的密码长度,然后通过try-except语句属兔捕获与处理用户应为输入不符合长度的密码而引发ShortInputError异常,若输入的密码长度小于3,则会抛出ShortInputError异常,否则则会提示密码设置成功

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值