04.异常

作者: JerryChenn07 | 来源:发表于2018-09-24 17:17 被阅读8次

    1、异常简介

    异常就是程序运行错误或者逻辑混乱。需要给客户友好的提示。

    异常一般是程序中无法完全避免,一般通过一定的手段,尽量减少异常的发生。

    异常:
    当Python检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的"异常"

    2、捕获异常

    2.1捕获异常 try...except...

    • 把可能出现问题的代码,放在try中
    • 把处理异常的代码,放在except中
    • except后不写任何类,表示捕捉任何异常
    • 这种结构虽然能捕捉异常,但是代码的速度有所降低,所以,只能把可能的出现异常的代码放到try 与 except之间

    2.2except捕获多个异常

    • 如果想通过一次except捕获到多个异常可以用一个元组的方式#except (IOError,NameError):
    • errorMsg里会保存捕获到的错误信息 #print(errorMsg)
    • 当出现异常。其实解析器会被这种异常分析,实例化得到一个异常对象xx,然后再与except里的异常类进行匹配,如果能匹配,as将异常对象赋给ex
    path = input('输入文件的路径:')
    content = None
    try:
        content = open(path,'r',encoding='utf-8').read()
    except FileNotFoundError as ex:
        print('4......')
        print('输入的路径不存在')
        print(ex)
    print('5......')
    print(content)
    

    2.3异常处理没有作用域

    • python中只有函数里和类里有作用域,其它都没有
    • 这里的ex是局部变量,其它都是全局变量

    2.4捕获所有异常

    • 开发的时候建议,捕捉异常要写的更详细。
    • 但是一般直接用Exception。简单省事。
    • 如果需要写很多异常类的描述,按照从小到大的顺序。因为有一个捕捉到了异常。不会再被捕捉了。

    2.5else

    • 在if中,它的作用是当条件不满足时执行的实行
    • 同样在try...except...中也是如此,即如果没有捕获到异常,那么就执行else中的事情

    2.6finally

    • 在程序中,如果一个段代码必须要执行,即无论异常是否产生都要执行,那么此时就需要使用finally。
    • 比如文件关闭,释放锁,把数据库连接返还给连接池等

    3、异常的传递

    3.1try的嵌套

    import time
    try:
        #f = open('test.txt')
        f = open(r'C:\Users\Administrator\Desktop\xx.txt')
        try:
            while True:
                content = f.readline()
                if len(content) == 0:
                    break
                num=1/0 #模拟一个异常
                #time.sleep(2)
                print(content)
        #except:
            #print('except...')
        finally:
            f.close()
            print('关闭文件')
    except:
        print('没有这个文件')
    

    3.2函数嵌套调用

    def test1():
        try:
            print("----test3-1----")
            test1()
            print("----test3-2----")
        except Exception as result:
            print("捕获到了异常,信息是:%s"%result)
    
        print("----test3-2----")
    
    test1()
    

    总结

    • 如果try嵌套,那么如果里面的try没有捕获到这个异常,那么外面的try会接收到这个异常,然后进行处理,如果外边的try依然没有捕获到,那么再进行传递。。。

    4、抛出自定义的异常

    • 用raise语句来引发一个异常。异常/错误对象必须有一个名字,且它们应是Error或Exception类的子类
    class NameShortException(Exception):
        def __init__(self,msg,num):
            self.msg = msg
            self.num = num
    
    
    def f():
        '''这是输入姓名并判断,如果姓名的长度小于3,抛出NameShortException异常'''
        name = input('请输入姓名:')
        if len(name.strip())<3:
            #手动抛出一个异常对象,以后的代码不再运行
            raise NameShortException('名字的长度至少是3',len(name.strip()))
        print('f......')
    
    
    def main():
        try:
            f()
        except Exception as ex:
            print('错误信息是:%s,输入的字符串长度是:%s'%(ex.msg,ex.num))
        print('其它代码。。。。。。。')
    
    main()
    
    #请输入姓名:12
    #错误信息是:名字的长度至少是3,输入的字符串长度是:2
    #其它代码。。。。。。。
    

    以后在mvc框架中,都会有异常处理。在最外层进行处理。
    
    try:
    
        #你写的代码
    
    except Exception as ex:
        将异常信息写到日志文件中
    
    else:
    
    finally:
    
    
    print('over......')
    
    
    所以,你写的代码可以处理异常,也可以不处理。
    一般要写一定的异常处理,为了让代码继续运行。
    
    还有,可以将异常继续抛出。为了让系统异常日志记录下来
    
    class SexException(Exception):
        def __init__(self,msg,value):
            self.msg = msg
            self.value = value
    
    def f1():
        sex = input('请输入性别:')
        if sex!='男' and sex!='女':
            raise SexException('性别只能输入男或者女',sex)
        print('f1...over.....')
            
    def f2():
        #num  = 1/0             # raise ZeroxxxError('除以0 了,不行')
        f1()
        print('f2...over.....')
    
    def main():
        try:
            f2()
        except Exception as ex:
            #print(ex.msg)
            raise
        print('main...over.....')
    
    #框架
    try:
        #你的代码
        main()
    except Exception as ex:
        #将错误信息写到文件中记录下来,打印模拟记录
        print(ex)
    

    相关文章

      网友评论

          本文标题:04.异常

          本文链接:https://www.haomeiwen.com/subject/othhoftx.html