zoukankan      html  css  js  c++  java
  • Python基础总结之异常、调试代码第十二天开始(新手可相互督促)

    年薪20万的梦想,加油!

           我们在写代码的时候,控制台经常会报错,因为某种错误,导致我们的程序停止,且不再运行下面的代码。

    我们看一个错误的代码示例:

    def add_1():     #没有参数
    print('我出错了') #不会被执行

    def add_2(): #函数二调用函数一
    print('第二个函数调用函数一,并给他一个参数')
    add_1(4) #函数一没有参数,所以有会报异常,并终止,不会执行函数一里面的代码

    def add_3(): #函数三调用函数二
    add_2()

    d = add_3() #调用函数三

            看完截图,可以理解在函数调用的路径中,控制台显示的调用过程很清晰,这个过程就是函数调用栈的概念,它可以直接找到出错的地方。因为定义的函数add_1,不需要任何参数。

            但是在调用的时候传入了一个参数值4,所以导致了程序停止,函数add_1里面的print语句没有被执行。

    当我们在控制台看到Traceback出现,就说明程序有异常出现,异常就是最下面的TypeError。它只是异常的一种,如果我们没有对异常进行捕获处理,程序就会停止,且后面的代码都不会再执行。

           我们可以使用   try...except...finally...  这样的方法来捕获异常,和处理异常。

     1 def add_1():     #不需要传入参数
     2     print('我出错了')        #不会被执行
     3 
     4 def add_2():           #函数二调用函数以
     5     print('第二个函数调用函数一,并给他一个参数')
     6     try:
     7         add_1(4)       #我们知道在这里,传参的时候会导致错误,所以我们在这里捕获异常。
     8     except :     #except 后面不添加任何错误类型,表示捕获所以异常类型。再不知道是什么类型的异常,导致程序停止,可以用它来处理。
     9         print('捕获了所有异常,不论什么异常导致')
    10 
    11 def add_3():
    12     add_2()
    13 d = add_3()       #调用函数三

    当我们不知道哪里异常的时候,我们可以将try...except...的范围先放大,然后慢慢缩小。

    1 try:
    2     a = ['a','b',1,2]    #创建一个列表,变量是a,指向列表
    3 
    4     print(c)        #打印出错变量c,会出现一个未声明对象的错误:NameError,代码中的变量c并没有指向任何对象
    5 except TypeError:   #TypeError是类型异常的错误,我们捕获的异常和程序出现的异常不一致,所以捕获是不成功的
    6     print('捕获异常')

    从图中发现我们捕获的异常和出现的异常不一致,所以异常的捕获是失效的,python 中有很多异常类型,如果不指定用哪个类型的异常捕获,那么就直接用案例一的方法,捕获所有异常,我们可以这样实现代码:

    except Exception:     也可以直接写成   except:  不加后面的Exception,也代表捕获所有的异常,两种格式。

    1 try:
    2     a = ['a','b',1,2]    #创建一个列表
    3 
    4     print(c)        #打印出错变量c,会出现一个未声明对象的错误:NameError,因为列表的变量是a
    5 except Exception:   #Exception,代表捕获所有类型的异常
    6     print('捕获所有类型的异常')

            如果我们程序运行到这里的时候,我们知道一般会出现哪几种情况,我们可以连续使用几个except代码块儿,分别捕获不同的异常。当执异常产生了,并且出现的异常类型是我们捕获的except代码块儿中的一个类型,那么所捕获的错误类型就会执行相应的代码,而不是对应的该异常的代码块,因为捕获的异常类型不匹配,所以它们对应的代码不会被执行。

    1 try:
    2     a = ['a','b',1,2]    #创建一个列表
    3 
    4     print(c)        #打印出错变量c,会出现一个未声明对象的异常报错:NameError,因为列表的变量是a
    5 
    6 except TypeError:
    7     print('捕获 TypeError 类型异常')
    8 except NameError:   #捕获NameError类型异常
    9     print('捕获 NameError 类型异常')

           我们知道了代码停止运行的异常类型,我们才能根据异常的类型去修改调试我们的代码。接下来我们再看看finally语句。finally语句,不管是否有异常,我们都有执行一段代码,比如,即使读取文件出现异常,那么我们也要执行后面的代码,那么我们就可以用finally这个关键字实现。

     1 import os                                   #导入os模块
     2 try:
     3     os.chdir(r'C:Program Files	ools')         #切换到指定的路径目录
     4     print(os.listdir(os.getcwd()))
     5 
     6     file_1= open(r'C:Program Files	oolsffff.txt')   #我们的目录中没有ffff.txt文件
     7 
     8 except FileNotFoundError:                             #捕获未找到文件的异常报错
     9     print('未找到文件 FileNotFoundError')
    10 
    11 finally:                                             #但是下面的代码我们还是想执行
    12     print('为了证明执行力finally的代码')

    捕获异常的初级使用方法大概就是这样捕获了。下面附上常见的异常类型, 多多敲击代码,出错后要尝试根据错误的提示,去修改代码,这也是一种成长~~~~~

        1.AssertionError:当assert断言条件为假的时候抛出的异常

      2.AttributeError:当访问的对象属性不存在的时候抛出的异常

      3.IndexError:超出对象索引的范围时抛出的异常

      4.KeyError:在字典中查找一个不存在的key抛出的异常

      5.NameError:访问一个不存在的变量时抛出的异常

      6.OSError:操作系统产生的异常

      7.SyntaxError:语法错误时会抛出此异常

      8.TypeError:类型错误,通常是不通类型之间的操作会出现此异常

      9.ZeroDivisionError:进行数学运算时除数为0时会出现此异常

  • 相关阅读:
    JVM 综述
    看 Netty 在 Dubbo 中如何应用
    Netty 心跳服务之 IdleStateHandler 源码分析
    Netty 高性能之道
    Netty 解码器抽象父类 ByteToMessageDecoder 源码解析
    Netty 源码剖析之 unSafe.write 方法
    Netty 出站缓冲区 ChannelOutboundBuffer 源码解析(isWritable 属性的重要性)
    Netty 源码剖析之 unSafe.read 方法
    Netty 内存回收之 noCleaner 策略
    Netty 源码阅读的思考------耗时业务到底该如何处理
  • 原文地址:https://www.cnblogs.com/woshidaliua/p/11291028.html
Copyright © 2011-2022 走看看