python-异常

 

 除零异常   ZeroDivisionError  

名称异常    NameError  

类型异常    TypeError

索引异常    IndexError

键异常       KeyError 

值异常      ValueError

属性异常   AttributeError

迭代器异常   StopIteration 

错误信息的获取:

错误信息中最后一行的第一个单词

异常处理方案一

捕获所有错误:

try:

    num=int(input('请输入整数:'))  #容易出错的代码

except:

    print('你输入错误')         #出错后,进行处理的代码

根据错误类型进行捕获:

try:

    num=int(input('请输入整数:'))  #容易出错的代码

    num = 8/num

except ValueError :

    print('请输入正确的整数')         #出错后,进行处理的代码

except ZeroDivisionError :

    print('除0错误')

说明:except后面是错误信息,可以有多个

多种异常一起处理:

try:
    #s=1/0
    print(name)
except (ZeroDivisionError,NameError):  #同时捕获不同异常
    print('除0异常或名称异常')

捕获未知错误:

try:

    num=int(input('请输入整数:'))  #容易出错的代码

    num = 8/num

except ValueError :

    print('请输入正确的整数')         #出错后,进行处理的代码

except Exception as cuowuxinxi:

print('错误信息:%s'%cuowuxinxi)

说明:cuowuxinxi保存返回的错误信息,这个错误信息和错误类型不一样

这个应该在所有预测到的错误类型之后

异常捕获的完整语法:

finally与return相遇时,先执行finally再return

异常处理方案二

with open('1.png','r') as f:#会自动执行__enter__方法,把返回的文件对象赋值给f
    #不管下面的代码是否出现异常,都会执行__exit__即自动退出文件
    f.readline()

自定义上下文管理器:


class Test:
def __enter__(self):
print('enter')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print('exit:')
print(self, exc_type, exc_val, exc_tb)

with Test() as x:
print('body',x)
 

执行以上代码时的结果是:

enter    --->先执行预处理函数__enter__ 
body <__main__.Test object at 0x0000009D1DDAD518>  --->执行代码,x是__enter__函数的返回值
exit:     --->最后执行退出函数
<__main__.Test object at 0x000000DE4971D518> None None None


class Test:
def __enter__(self):
print('enter')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print('exit:')
print(exc_type, ',',exc_val,',', exc_tb)
return True #返回True不会再抛出异常信息

with Test() as x:
print('body')
1/0 #产生异常,把异常信息传给__exit__函数
 

显示结果:

exc_type--->异常类型
exc_val--->异常值
exc_tb--->追踪信息

class Test:
    def __enter__(self):
        print('enter')
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('exit:')
        print(exc_type, ',',exc_val,',', exc_tb)
        import traceback
        print(traceback.extract_tb(exc_tb)) #打印追踪信息
        #[<FrameSummary file D:/ss/ssss/test1.py, line 15 in <module>>]
        return True

with Test() as x:
    print('body')
    1/0

人为抛出异常raise:

def a(age):
    if age<0 or age>120:
        #print('年龄值错误')
        raise ValueError('年龄值错误')
        #ValueError  是异常类型
        #参数  提示信息。except ValueError as x,这个参数会赋值给x
    else:
        print('张三的年龄是',age)

a(-18)

 自定义异常类型:

 

class lesszero(Exception):#自定义异常类,继承与Exception
    def __init__(self,msg):
        self.msg=msg
    def __str__(self):
        return self.msg
def a(age):
    if age<0 or age>120:
        raise lesszero('年龄值错误')  #抛出自定义异常类-执行异常类
        #参数传给msg
    else:
        print('张三的年龄是',age)

try:
    a(-18)
except lesszero as x:  #x就是__str__返回的值
    print('异常被处理',x)  #异常被处理 年龄值错误

天子骄龙

原文地址:https://www.cnblogs.com/liming19680104/p/10855833.html