Python(五)异常处理

一、异常处理

    1.1、什么是异常处理

    异常是程序发生错误的信号,即程序一旦出错就会立刻产生一个异常,如果该异常没有被处理,那么异常就抛出来,程序的运行也随之终止。

    1.2、异常的分类:异常分为三部分:

        1.异常的类型

        2.异常的内容、提示信息

        3.异常的追踪/定位信息信息

        捕捉/检测异常,一旦发生异常就立刻执行相应的处理逻辑,而不是任由异常抛出来终止程序

    1.3、异常的分类

        1.3.1、语法异常

        1.3.2、逻辑异常

    1.4、为何要进行异常处理

        增强程序的健壮性

    1.5、Python常见的错误类型

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                   用户代码生成的警告

 

    1.6、异常处理的方法

    1.6.1、try...except IndexError     捕捉指定单个错误"IndexError"类型

    try不影响正常代码的执行,也就是说try里面的报错被except 接受后,其他正常的代码还能正常运行,程序不会被退出。

try:
    age=10
    age
    l=[1,2,3]
    l[100]         #错误1:列表l里面没有索引100
    当执行到这一行代码时,出现了索引报错,except会接受这个报错,那么当前行之后的所有代码都不在执行
    d={'x':1}
    d['y']        #错误2:字典内没有y这个'key'
except IndexError:    如果except后面的错误类型不为IndexError那么程序就会抛出异常,整个程序都会被结束掉
    print('=====>IndexError')

print('其他正常的代码')

>>:=====>IndexError
>>:其他正常的代码

 

    1.6.2、try...except Exception 捕捉所有错误类型(万能异常)

try:
    age=10
    age
    l=[1,2,3]
    l[100]          #错误1:列表l里面没有索引100
    d={'x':1}
    d['y']          #错误2:字典内没有y这个'key'
except Exception:   #捕捉程序中所有的异常
    print('=====>程序出现异常')

print('其他正常的代码')
>>:程序出现异常
>>:其他正常的代码

 

    1.6.3、通过 try...except Exception as xxx   拿到所有异常的报错信息

try:
    age=10
    age
    l=[1,2,3]
    # l[100]          #错误1:列表l里面没有索引100
    d={'x':1}
    # d['y']          #错误2:字典内没有y这个'key'
    import os
    os.aaa
except Exception as e:   #捕捉程序中所有的异常,把捕捉到的异常附一个值
    print('>>:万能异常',e)   #通过打印输出错误类型的值,就能准确知道哪里出错

>>:万能异常 module 'os' has no attribute 'aaa'

 

    1.6.4、单独处理某一类型的异常,已万能异常混合使用

try:
    age=10
    age
    l=[1,2,3]
    l[100]          #错误1:列表l里面没有索引100,丢给except IndexError
    d={'x':1}
    d['y']          #错误2:字典内没有y这个'key',丢给except KeyError
    import os       #错误3:os模块下没有aaa这个用法,丢给except Exception
    os.aaa

except IndexError as e:              #满足IndexError时被expect捕捉
    print('>>:IndexError',e)
>>:IndexError list index out of range

except KeyError as e:               #满足KeyError时被expect捕捉
    print('>>:KeyError', e)
>>:KeyError 'y'

except Exception as e:             #出现其他所有错误时被Exception捕捉
    print('>>:万能异常',e)
>>:万能异常 module 'os' has no attribute 'aaa'

 

1.6.5、try .. expect .. else 语法

    try ...
    expect ...
    else ...  else不能单独使用,必须与expect连用,意思是:else的子代码块会在被检测的代码没有出现过任何异常下执行 (和 if ... else 是一样的,在所有的 except 条件判断都不能匹配的时候,执行else )

try:
    age=10
    age
    l=[1,2,3]
    l[100]          #错误1:列表l里面没有索引100,丢给except IndexError
    d={'x':1}
    d['y']          #错误2:字典内没有y这个'key',丢给except KeyError
    import os       #错误3:os模块下没有aaa这个用法,丢给except Exception
    os.aaa

except IndexError as e:
    print('>>:IndexError',e)

except KeyError as e:
    print('>>:KeyError', e)

except Exception as e:
    print('>>:万能异常',e)

else:
    print('其他代码')

 

1.6.6、try ... finally ...使用

    在使用try ... finally ...时,无论程序是否发生异常,finally 之后的代码还是会被执行。一般是资源类的方法使用,比如打开一个文件,如果抛异常后程序被终止,然后文件不会被系统回收掉,需要写一个finally执行关闭文件的指令。

    当程序有异常时:先输出finally,在抛出异常

try:
    age=10
    age
    l=[1,2,3]
    l[100]          #错误1:
    d={'x':1}
    d['y']          #错误2:
    import os       #错误3:
    os.aaa

finally:
    print('无论有没有异常发生,都会执行,同时异常也会被抛出')

>>:无论有没有异常发生,都会执行,同时异常也会被抛出     #先把finally后的数据执行,然后在抛出异常
>>:Traceback (most recent call last):
>>:  File "C:/Users/stsud/Desktop/Pycharm文档/第九次课/异常处理.py", line 118, in <module>
>>:    l[100]          #错误1:列表l里面没有索引100,丢给except IndexError
>>:IndexError: list index out of range

    当程序无异常时:finally正常输出

try:
    age=10
    age
    l=[1,2,3]
    l[100]          #错误1:列表l里面没有索引100,丢给except IndexError
    d={'x':1}
    d['y']          #错误2:字典内没有y这个'key',丢给except KeyError
    import os       #错误3:os模块下没有aaa这个用法,丢给except Exception
    os.aaa

except IndexError as e:
    print('>>:IndexError',e)
except KeyError as e:
    print('>>:KeyError', e)
except Exception as e:
    print('>>:万能异常',e)
else:
    print("111111")

finally:
    print('无论有没有异常发生,都会执行,同时异常也会被抛出')

>>:IndexError list index out of range
>>:无论有没有异常发生,都会执行,同时异常也会被抛出

 

1.7、try ... expect ... else ... finally ...  这是完整的语法顺序

    1、可以 try ... finally

    2、可以 try ... expect

    3、可以 try ... expect ... else

    4、可以 try ... expect ... finally   

    5、可以 try ... expect ... else... finally   

    6、不能 try ... else

 

1.8、主动触发异常  raise,assert  程序触发某一条件后,主动抛出一个异常,并终止程序的执行。

一、raise  主动抛出一个异常并结束运行。
# raise 例子:
class People:
    def __init__(self,name):
        if not isinstance(name,str):   #isinstance:判断对象的name是否为str类型,如果对象的name不是str类型
            raise TypeError('%s 必须是str类型' %name)    #那么就主动触发异常
        self.name=name
p=People(123)
>>:TypeError: 123 必须是str类型


二、assert xxx :判断 xxx 是否满足,满足的话就继续往下执行代码,否则抛出异常并结束运行。
# assert(断言) 例子:
print("11111")
szq_list=["a","b"]

# assert(断言):如果条件 "len(szq_list) < 0" 满足的话,就运行之后的代码,否则抛出一个异常并结束运行。
assert len(szq_list) < 0

# assert 相当于如下的代码:
# if len(szq_list) < 0:
#      raise TypeError("抛出异常")

print("22222")
>>:AssertionError

 

1.9、自定义异常 -- 内置异常不足时使用

class RegistryError(BaseException):
    def __init__(self,msg,user):
        self.msg=msg
        self.user=user

    def __str__(self):
        return '<%s: %s>' %(self.user,self.msg)

raise RegistryError('注册失败','teacher')

>>:__main__.RegistryError: <teacher: 注册失败>

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值