异常处理

异常处理

  • 错误类型

    • 语法错误
    #语法错误示例一
    if()
    #语法错误示例二
    def test:
        pass
    此类错误为语法错误,执行时会显示错误信息:SyntaxError: invalid syntax
    
    • 逻辑错误
    #错误示例一
    num=input('输入数字:')
    int(num)
    若输入的非纯数字的字符,则会显示错误信息:ValueError: invalid literal for int() with base 10
        
    #错误示例二
    print(1/0)
    错误信息:ZeroDivisionError: division by zero
        
    #错误示例二
    print(1+'skk')
    错误信息:TypeError: unsupported operand type(s) for +: 'int' and 'str'
    
  • 什么是异常&常见异常类型

    • 什么是异常:异常就是程序运行时发生错误的信号,导致程序无法正常执行
    • 常见异常类型
    1.IndexError:超出对象索引的范围时抛出的异常,
    li=[1,2,3]
    print(li[5])
    
    2.KeyError:在字典中查找一个不存在的key抛出的异常
    dic={'name':'小李'}
    print(dic['age'])
    
    3.ValueError:数值错误,传入一个调用者不期望的值时抛出的异常,即使值的类型是正确的
    int('hello')
    
    4.AssertionError:当assert断言条件为假的时候抛出的异常
    
    5.AttributeError:当访问的对象属性不存在的时候抛出的异常
    
    6.OSError:操作系统产生的异常
    
    7.SyntaxError:语法错误时会抛出此异常
    
    8.TypeError:类型错误,通常是不通类型之间的操作会出现此异常
    
    9.ZeroDivisionError:进行数学运算时除数为0时会出现此异常
    
    
  • 异常处理

    • 什么是异常处理:捕获到程序执行时产生的异常后进入另外一个分支,执行为其定制的逻辑,使程序不会奔溃
    • 异常处理语法
    try:
         被检测的代码块
    except 异常类型:
         try中一旦检测到异常,就执行这个位置的逻辑
    
    • 捕获异常
    #万能异常:Exception,可以捕获到任意异常
    str1='hello'
    try:
        int(str1)
        num=str1+1
    except Exception as e:
        #其他处理
        print(e.args)
    #Exception使用场景:无论程序出现何种异常,都用同一逻辑去处理
    
    如果你的程序会出现多种异常,针对不同异常,希望用不同的逻辑处理,那该怎么办呢?
    这时就需要用多分支来处理
    def func(num1,num2):
        value=num1/num2
    try:
        func(' ',0)
    except ZeroDivisionError as e:
        print('除数不能为0')
    except TypeError as e:
        print('传入的值不为数字')
    except Exception as e:#当错误类型不为以上两种时,用万能异常来处理异常
        print(e.args)
    
    
  • 自定义异常类

    对于某些我们想要捕获的异常,python中没有定义出来时,我们就需要自定义异常来满足需求

class NumError(BaseException):
    def __init__(self,msg):
        self.msg=msg
  • 抛出异常

    有了异常处理,为什么还要抛出异常呢?什么又是抛出异常呢?异常处理是针对程

    序在执行过程中可能会出现的一些错误导致程序无法执行而进行的处理,但如果程

    序本身没有错误,可以正常运行,而想捕获到用户一些异常行为时的信息,就需要

    用到抛出异常了

#自定义异常
class NumError(BaseException):
    def __init__(self,msg):
        self.msg=msg
#当年龄未达到18时抛出异常        
def getAge():
    age=int(input('请输入年龄:'))
    if age>=18:
        print('年龄通过')
        pass
    else:
        raise NumError('年龄不符合要求')
#对getAge()产生的异常进行处理        
try:
    getAge()
except NumError as e:
    print(e)
  • 案例:自定义一个异常类,该类可以把getNum()方法产生的异常信息写入到日志中

    getNum()方法是用来筛选大于10 的数字的,如果数字小于就会抛出异常

from datetime import datetime
#定义异常类
class MyException(Exception):
    def __init__(self,msg):
        self.msg=msg
     #将异常写入文件   
    def writeLog(self):
        errortime = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        errorfile = self.__traceback__.tb_frame.f_globals["__file__"] #发生异常所在的文件
        errorlineno = self.__traceback__.tb_lineno   #发生异常所在的行
        errorinfo=self.args[0] #异常信息
        with open('error.log','a+',encoding='utf-8')as f:
            f.write(errortime+'---'+errorfile+'---'+str(errorlineno)+'---'+errorinfo+'\n')
# 不符合条件的数据,抛出异常            
def getNum(num):
    if num>10:
        print('符合条件的数据')
    else:
        raise MyException('该数据小于10,不符合条件')
#异常处理        
try :
    getNum(5)
except MyException as e:
    print('产生异常',e.args[0])
    e.writeLog()

思考题

  • 创建一个Exception的子类MyException 包括一个写入日志文件的方法,写入内容

    有:出错时间,出错的文件,所在的行数

class MyException(Exception):
    def writeLog(self,filename,lineno,message):
        f=open('error1','a+',encoding='utf-8')
        errortime=datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        error='出错时间:'+errortime+' ; 出错文件:'+filename+' ;出错所在行数:'+str(lineno)+' ;出错的信息:'+message+'\n'
        f.write(error)
        f.close()
  • 创建一个带有抛出MyException的函数,具体内容是:
    1. 往一个文件a.txt中写入16位的随机字符(包括数字,字母)
    2. 写入的时间间隔为大于等于2小时
    3. 如果写入的文件小于2小时就抛出异常MyException的实例,异常信息为:写入内容时间间隔不够俩小时,同时把错误信息写入到日志中
from datetime import datetime
import string
import random
import os
# 自定义异常,并将异常写入文件
class MyException(Exception):
    def __init__(self,msg):
        self.msg=msg
    def writeLog(self):
        errortime = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        errorfile = self.__traceback__.tb_frame.f_globals["__file__"]
        errorlineno = self.__traceback__.tb_lineno
        errorinfo=self.args[0]
        with open('error.log','a+',encoding='utf-8')as f:
            f.write(errortime+'---'+errorfile+'---'+str(errorlineno)+'---'+errorinfo+'\n')
#获取时间差            
def deltatime():
    nowtime = datetime.now().timestamp()
    changetime = os.path.getatime('a.txt')#获取上一次文件修改时间
    delta=nowtime-changetime
    return delta
# 将字符写入文件
def func():
    str1= ''.join(random.sample(string.ascii_lowercase+string.ascii_uppercase+string.digits,16))
    time=deltatime()
    if time>2*60*60:
        with open('a.txt','a+',encoding='utf-8')as f:
            f.write(str1+'\n')
    else:
        raise MyException('距文件上一次修改时间不足2小时')#抛出异常
#异常处理        
try:
   func()
except MyException as e:
    print(e.args[0],'  请稍等片刻再修改')
    e.writeLog()
posted @ 2021-04-07 14:33  辰-月  阅读(173)  评论(0)    收藏  举报