异常处理

一、什么是异常

'''
异常就是程序运行时发生的错误信号,(在程序出现错误时,则会产生一个异常,若程序没处理它,则会抛出异常,程序的运行也会随之终止)

异常分为两种:
    语法错误:这种错误必须在程序运行前就得改正
    逻辑错误:
        1、如果能够预知错误发生的条件,应该使用if判断去预防
        2、如果无法预知错误发生的条件,即错误可能会发生,应该是使用try....except进行补救
'''

异常名称            描述
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、单分支

try:
    # 被检测代码
    age            # 一旦被检测代码抛出异常,则此代码的下面的代码则不会执行
    print('hello world')
except NameError as e:         # 异常类型    e是异常的值
    print('程序异常了:', e)      # try中一旦检测到异常,就执行此处的逻辑

2、多分支

s1 = 'Linux'
try:
    int(s1)
except IndexError as e:
    print(e)
except KeyError as e:
    print(e)
except ValueError as e:
    print(e)

3、万能异常捕获Exception

s1='Linux'

try:
    int(s1)
except Exception as e:
    print(e)

4、else(被检测的代码无异常抛出,才会执行)

try:
    age=20
except Exception as e:
    print(e)
else:           # 被检测的代码,没异常抛出,不能单独存在
    print('try里的代码没问题')  # 被检测代码无异常抛出,则执行此逻辑

5、 finally(被检测代码无论有无异常抛出,都会执行)

try:
    age=20
finally:        # 无论被检测代码有无异常抛出,都会执行   可单独存在
    print('资源回收')         # 常用与资源回收

6、主动抛出异常raise

class  UserInfo:
    def __init__(self,name,age):
        self.__name=name
        self.__age=age

    def get(self):
        print('<姓名: %s  年龄: %s>' %(self.__name,self.__age))

    def set(self,name,age):
        if not isinstance(name,str):
            raise TypeError('姓名必须是str类型')
        if not isinstance(age,int):
            raise TypeError('年龄必须是int类型')
        self.__name=name
        self.__age=age
userinfo
=UserInfo('fred',20) userinfo.get() # 处理主动抛出的异常 try: userinfo.set(10,10) except TypeError as e: print(e)

7、自定义异常

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

    def __str__(self):
        return self.msg


try:
    raise MyExpect('TypeError')
except MyExpect as e:
    print(e)

三、异常处理总结

'''
多分支异常与万能异常:
    如果想要无论出现什么异常,都是用同一逻辑处理,Exception是上上之选
    如果想要对于不同异常定制不同的处理逻辑,那就需要用到多分支

加上异常处理的逻辑
    1、把错误处理和真正的工作分开来
    2、代码更易组织,更清晰,复杂的工作任务更容易实现
    3、代码健壮性提高了,不至于由于一些小的疏忽而使程序意外崩溃了

try....except加的越多,代码的可读性越差,所以打铁还需自身硬,好好提高开发能力吧
'''
原文地址:https://www.cnblogs.com/lichunke/p/9628838.html