ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-03-31 00:32:22  阅读:223  来源: 互联网

标签:处理 except try python lst error print 异常


认识异常处理

# ### 异常处理


# 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         除数为零

 

标签:处理,except,try,python,lst,error,print,异常
来源: https://www.cnblogs.com/shuaiyao666/p/16079916.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有