python 异常处理

每日一记

IndexError                索引超出序列的范围
KeyError                  字典中查找一个不存在的关键字
NameError                 尝试访问一个不存在的变量
IndentationError          缩进错误
AttributeError            尝试访问未知的对象属性
StopIteration             迭代器没有更多的值
AssertionError           断言语句(assert)失败
EOFError                  用户输入文件末尾标志EOF(Ctrl+d)
FloatingPointError        浮点计算错误
GeneratorExit             generator.close()方法被调用的时候
ImportError               导入模块失败的时候
KeyboardInterrupt         用户输入中断键(Ctrl+c)
MemoryError               内存溢出(可通过删除对象释放内存)
NotImplementedError       尚未实现的方法
OSError                   操作系统产生的异常(例如打开一个不存在的文件)
OverflowError             数值运算超出最大限制
ReferenceError            弱引用(weak reference)试图访问一个已经被垃圾回收机制回收了的对象
RuntimeError              一般的运行时错误
SyntaxError               Python的语法错误
TabError                  Tab和空格混合使用
SystemError               Python编译器系统错误
SystemExit                Python编译器进程被关闭
TypeError                 不同类型间的无效操作
UnboundLocalError         访问一个未初始化的本地变量(NameError的子类)
UnicodeError              Unicode相关的错误(ValueError的子类)
UnicodeEncodeError        Unicode编码时的错误(UnicodeError的子类)
UnicodeDecodeError        Unicode解码时的错误(UnicodeError的子类)
UnicodeTranslateError     Unicode转换时的错误(UnicodeError的子类)
ValueError                传入无效的参数
ZeroDivisionError         除数为零

  

异常处理

1, 基本格式

# 捕捉异常错误,防止异常抛错,终止程序.
try:
    # 可能出现异常的代码
    lst = [1,2,3]
    print(lst[10])
except:
    print("出现异常")
    
# AssertError 断言失败错误
"""
断言就是猜的意思
assert 和 if 之间的区别在于
assert 在断言失败时候,是直接报错,抛出异常,后面的代码直接终止了.
if     在判断为False 的时候,不执行代码
"""

  

2, 分支结构

# except + 异常错误类 特指发生在这类异常错误时,要执行的分支
try:
    lst = [1,2,3]
    print(lst[10])
except KeyError :
    print("没有这个键而发生错误")
except IndexError :
    print("索引超出范围!")
    
# 只执行第一次报错的特指异常,往后不再执行

  

3, 迭代器异常错误处理

def gen_func():
    print("生成器")
    yield 1
    yield 2
    yield 3
    return 4
try :
    gen = gen_func()
    print(next(gen))
    print(next(gen))
    print(next(gen))
    print(next(gen))          # 没有执行return语句,因为错误
except StopIteration as e :   # e是对象,底层有__str__方法,print时自动触发
    print(e,"生成器迭代结束!")

  

4, 异常处理大组合

# try , except , else , finally 
try:
    lst = [1,2,3]
    print(lst[10])
except KeyError:
    print("没有这个键而发生错误")
except IndexError :
    print("索引超出范围!")
else :
    print("没有异常")
finally:
    print("无论如何都要执行")

  

5, 主动抛出异常 raise

# 基本格式
try:
    raise BaseException
except BaseException:
    print("出现错误")

  

5.1,自定义异常类

# 系统底层获取行数和文件名的函数 (只有在程序异常时才能触发) 
def return_errorinfo(n):
    import sys
    f = sys.exc_info()[2].tb_frame.f_back
    if n==1:        
        return str(f.f_lineno)       # 返回当前行数
    elif n == 2:    
        return f.f_code.co_filename  # 返回文件名
 
# 自定义错误信息类
class MyException(BaseException):
    def __init__(self,num,msg,line,file):
        # 错误号
        self.num = num
        # 错误信息
        self.msg = msg
        # 错误行号
        self.line = line
        # 错误文件
        self.file = file
​
# 主动抛出异常
def raise_func(n):
    try :
        raise
    except:
        return return_errorinfo(n)
​
# 捕捉自定义异常类信息
sex = "雌雄同体"
try:
    if sex == "雌雄同体":
        # raise + 异常错误类 或者 异常错误类对象
        raise MyException(404,"醒醒吧老弟,人类没有雌雄同体~",get_value(1),get_value(2))
​
except MyException as e:
    # 对象.属性 
    print(e.num)
    print(e.msg)
    print(e.line)
    print(e.file)

  

 

 

posted @ 2020-08-10 21:33  bajie_new  阅读(118)  评论(0编辑  收藏  举报