Python教程

python认识异常处理及异常处理,主动抛出异常处理

本文主要是介绍python认识异常处理及异常处理,主动抛出异常处理,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

认识异常处理

# ### 异常处理


# IndexError                索引超出序列的范围
# lst = [1,2,3]
# lst[1000]

# KeyError                  字典中查找一个不存在的关键字
# dic = {"a":1,"b":2}
# dic["c"]

# NameError                 尝试访问一个不存在的变量
# print(wangwen112312313123123123123123123123123123s)

# IndentationError          缩进错误
# if 5 == 5:
    # print(1)
 # print(2)


# AttributeError            尝试访问未知的对象属性
# class MyClass():
    # a = 100
# obj = MyClass()
# obj.abc


# StopIteration             迭代器没有更多的值
# it = iter(range(3))
# res = next(it)
# res = next(it)
# res = next(it)
# res = next(it)

# AssertionError             断言语句(assert)失败
"""assert猜的意思 , 叫断言, 
如果是正确的没有任何反应,代码正常执行
如果是错误的直接报错,终止程序
"""
# assert 5 < 3
# print(111)

 

异常处理的语法

try .. except .. 来抑制错误
把又可能报错的代码放到try这个代码块当中,
如果有报错,直接执行except这个代码块
如果没有报错,不执行except这个代码块


在异常处理当中,所有的异常错误类都继承 BaseException Exception 普通异常的父类(了解)
# 类型上的子父关系
from collections import Iterator,Iterable
print(issubclass(Iterator, Iterable))

 

1.基本语法

class MyClass():
    a = 6

try:
    lst = [1,2,3]
    lst[1000]
except:
    pass
    

try:
    lst = [1,2,3]
    lst[1000]
except BaseException:
    pass

 

2.带有分支的异常处理

try:
    # lst = [1,2,3]
    # lst[1000]
    
    # dic = {"a":1,"b":2}
    # dic["c"]
    
    # print(lisi)
    
    MyClass.abc()
except IndexError:
    print("下标越界1")
except KeyError:
    print("字典的键不存在2")
except NameError:
    print("这个变量不存在的3")
except :
    print("有异常错误4")

 

3.处理生成器的异常报错

def mygen():
    yield 1
    yield 2
    yield 3
    return [1,2,3]

try:
    gen = mygen()
    print(next(gen))
    print(next(gen))
    print(next(gen))
    print(next(gen))
    
    # 给StopIteration这个类创建出来的对象起一个别名叫e
    """ 
    当你打印对象时,会触发内部__str__方法,通过一些列的调用,返回出最后的返回值
    """
except StopIteration as e:
    # 可以获取返回值
    print(e)
    
    """
    # 额外的扩展
    res = str(e)
    print(res , type(res) ,  "<======>")
    res2 = eval(res)
    print(res2,type(res2))
    """

 

 

4.异常处理的其他写法

"""
1 .try .. except .. else ..
当try这个代码块当中没有报错的时候,执行else这个分支
如果try代码块有报错,就不执行else这个分支
"""
try:
    # lst = [1,2,3]
    # lst[1000]
    print(123)
except:
    pass
else:
    print("执行了else分支 ... ")

"""
2.try .. finally ... 无论代码是否报错,都必须要执行的代码写在finally这个代码块当中
场景:应用在异常环境下,保存数据或者关闭数据库等操作,必须要在数据库程序崩溃之前执行的代码写在finally代码块中;
"""

"""
try:
    lst = [1,2,3]
    lst[1000]
finally:    
    print(234678)
"""
    
"""3.try .. except .. else .. finally .. """

try:
    lst = [1,2,3]
    lst[1000]
    # print(123)
    
except:
    print(456)
    
else:
    print("执行了else分支 ... ")
finally:
    print("执行关闭数据库操作")

 

主动抛出异常

BaseException 所有异常类的父类
Exception 普通异常类的父类
raise + 异常错误类 / 异常错误类对象

 

# (1) raise 基本语法
# raise KeyError
# raise KeyError()
"""
try:
    raise 
except:
    pass

try:
    raise 
except BaseException:
    pass
"""

# (2) 自定义异常错误类
"""必须继承异常类的父类 BaseException """
# return_errorinfo必须在报错的情况下才能触发内部相应方法获取当前行号和文件名
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 #返回文件名    


# 通过主动抛出异常,来获取响应的数据
def get_info(n):
    try:
        raise 
    except:
        return return_errorinfo(n)

# 自定义异常错误类
class MyException(BaseException):
    def __init__(self,error_num,error_msg,error_filename,error_linenum):
        self.error_num = error_num
        self.error_msg = error_msg
        self.error_filename = error_filename
        self.error_linenum = error_linenum

eye = "轮回眼"
try:
    if eye == "轮回眼":
        raise MyException( 404,"人类没有轮回眼",get_info(2) , get_info(1) )         
        
except MyException as e: #给自定义MyException异常类的对象起个别名叫做e
    print(e.error_num)
    print(e.error_msg)
    print(e.error_filename)
    print(e.error_linenum)
View Code

 

获取错误行号和文件名

#系统底层获取行数和文件名的函数( 只有在程序异常时才能触发 ) 
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 #返回文件名    
View Code

 

 

异常的分类

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

 

这篇关于python认识异常处理及异常处理,主动抛出异常处理的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!