zoukankan      html  css  js  c++  java
  • Python异常

    目标:

    • 异常的概念
    • 捕获异常
    • 异常传递
    • 自定义异常

    1.异常的概念

    • 在程序运行时,如果Python解释器遇到一个错误,会停止程序的执行,并提示一些错误信息,这就是异常
    • 程序停止执行并且提示错误信息 这个动作,我们通常称之为异常
    • 程序在开发时,很难将 所有的特殊情况 都处理的面面俱到,通过 异常捕获 可以针对突发事件做集中的处理,从而保证程序的稳定性和健壮性

    python中的异常:

    • TypeError :  不同类型间的无效操作 
      • 不同类型的数据进行运算操作时,会引发TypeError异常
      • 下述信息表明,“str”型数据不能直接与“int”型数据进行比较
        birth = input("birth")
        if birth < 2000:
            print("00前")
        else:
            print("00后")

          

    • ZeroDivisionError :  除数为0
      • 当除数为0时,会引发ZeroDivisionError异常
      • 下述信息表明,除数不能为0
        print(1/0)

    • NameError :
      • 尝试访问一个未声明的变量时,会引发NameError异常
      • 下述信息表明,解释器在任何命名空间里都没找到变量b
        a = 1
        c = a+b
        print(c)

    • SyntaxError :
      • 当解释器发现语法错误时,会引发SynataxError异常
      • 下述示例中,由于for循环的后面缺少冒号,所以导致程序出现如下错误信息
        list_1 = [1,2,3,4]
        for i in list_1
            print(i)

    • IndentationError :
      • Python最具特色的就时依靠代码块的缩进来体现代码之间的逻辑关系,当缩进错误时,会引发IndentationError(缩进错误)异常
      • 下述示例中,由于for循环语句块没有缩进,所以导致程序出现如下错误信息:
        list_1 = [1,2,3,4]
        for i in list_1:
        print(i)

    • IndexError :
      • 当使用序列中不存在的索引时,会引发IndexError(索引超出序列的范围)异常
      • 下述示例表明,列表的索引值超出了列表的范围
        list_1 = [1,2,3,4]
        print(list_1[4])

    • KeyError :
      • 当使用字典中不存在的键时,会引发KeyError(字典中查找一个不存在的关键字)异常
      • 下述信息表明,使用了字典中没有的键
        dict_1 = {
            "one":1,
            "two":2
        }
        print(dict_1["one"])
        print(dict_1["three"])

    • ValueError :
      • 当传给函数的参数类型不正确时,会引发ValueError(传入无效参数)异常
      • 下述信息表明,int()函数传入了无效的字符串型参数
        a = int("b")

    • FileNotFoundError :
      • 当试图用只读方式打开一个不存在的文件时,会引发FileNotFoundError (python3.2以前是 IOError) 异常
      • 下述信息表名,没有找到名为“1.txt”的文件或目录
        file = open("1.txt")

    • AttributeError :
    • 当尝试访问未知的对象属性时,会引发AttributeError(尝试访问未知的对象属性)异常
    • 上述信息表明,在Car类中没有定义name属性,所以访问name属性时出现异常
      class Car():
          color = "black"
      
      car = Car()
      print(car.color)
      print(car.name)

    2.捕获异常

    2.1简单的捕获异常的语法

    • 在程序开发中,如果对某些代码的执行不能确定是否正确,可以增加 try(尝试) 来捕获异常
    • 捕获异常最简单的语法格式:
    • try:
          尝试执行的代码
      except:
          出现错误的处理
    •  try 尝试,下方编写要尝试的代码,不确定是否能够正常执行的代码
    • except 如果不是,下方编写尝试失败的代码

      简单异常捕获演练——要求用户输入整数

    •  1 #简单的捕获异常
       2 try:
       3     a = int(input("请输入一个整数"))
       4 except:
       5     print("请输入一个正确的整数")
       6 print("*"*30)
       7 """
       8 运行结果:
       9 请输入一个整数5
      10 ******************************
      11 
      12 请输入一个整数abc
      13 请输入一个正确的整数
      14 ******************************
      15 
      16 """
      View Code

    2.2错误类型捕获

    • 在程序执行时,可能会遇到不同类型的异常,并且 需要针对不同类型的异常,做出不同的相应,这个时候就需要捕获错误类型了。
    • 语法如下:
      • try:
            #尝试执行的代码
            pass
        except 错误类型1:
            #针对错误类型1,对应的处理代码
            pass
        except 错误类型2:
            #针对错误类型2,对应的处理代码
            pass
        except Exception as result:
            print("未知错误%s" % result)
    • 当Python解释器抛出异常时,最后一行错误信息的第一个单词,就是错误类型
    • 异常演练:
      • 需求:
        1. 提示用户输入一个整数
        2. 使用8除以用户输入的整数并输出
      • 1 try:
        2     num = int(input("请输入一个整数,且不能为0:"))
        3     a = 8 / num
        4     print(a)
        5 except ValueError:
        6     print("请输入正确的整数")
        7 except ZeroDivisionError:
        8     print("不能输入0")
        View Code
    • 捕获未知错误
      • 在开发时,要预判到所有可能出现的错误,还是有一定难度的
      • 如果希望程序,无论出现任何错误,都不会因为Python解释器抛出异常为终止,可以在增加一个except  Exception as result
        • 演示:假如没有考虑到除以0这种情况
        •  1 try:
           2     num = int(input("请输入一个整数,且不能为0:"))
           3     a = 8 / num
           4     print(a)
           5 except ValueError:
           6     print("请输入正确的整数")
           7 except Exception as result:
           8     print("未知错误%s" % result)
           9 """
          10 运行结果:
          11 请输入一个整数,且不能为0:0
          12 未知错误division by zero
          13 """
          View Code

    2.3异常捕获完整语法

    • 在实际开发中,为了能够处理复杂的异常情况,完整的异常语法如下:
      • try:
            #尝试执行的代码
            pass
        except 错误类型1:
            #针对错误类型1,对应的处理代码
            pass
        except 错误类型2:
            #针对错误类型2,对应的处理代码
            pass
        except (错误类型3,错误类型4):
            #针对 错误类型3 和 错误类型4 对应的处理代码
            pass
        except Exception as result:
            print("未知错误%s" % result)
        else:
            #没有异常才会执行的代码
            pass
        finally:
            #无论是否有异常,都会执行的代码
            print("无论是否有异常,都会执行的代码")
      • else 只有在没有异常时,才会执行的代码

      • finally 无论是否有异常,都会执行的代码 

    3.异常的传递

    • 异常的传递——当函数/方法执行出现异常,会将异常传递给 函数/方法的 调用一方
    • 如果 传递到主程序 任然 没有异常处理,程序才会被终止
      •  1 #异常的传递性
         2 def fun1():
         3     return int(input("请输入一个整数"))
         4 
         5 def fun2():
         6     fun1()
         7 
         8 fun2()
         9 
        10 """
        11 请输入一个整数a
        12 Traceback (most recent call last):
        13   File "D:python_DMvenvjiaoxue异常异常.py", line 8, in <module>
        14     fun2()
        15   File "D:python_DMvenvjiaoxue异常异常.py", line 6, in fun2
        16     fun1()
        17   File "D:python_DMvenvjiaoxue异常异常.py", line 3, in fun1
        18     return int(input("请输入一个整数"))
        19 ValueError: invalid literal for int() with base 10: 'a'
        20  传递顺序:3 - > 6 --> 8
        21 
        22 """
    • 提示:
      • 在开发中,可以在主函数中增加 异常捕获
      • 而在主函数中调用的其他函数,只要出现异常,都会传递到主函数的 异常捕获 中
      • 这样就不需要在代码中增加大量的 异常捕获,能够保证代码的整洁
      • 代码演示:
        • def fun1():
              return int(input("请输入一个整数"))
          
          def fun2():
              fun1()
          
          try:
              fun2()
          except Exception as result:
              print("未知错误%s"%result)
          
          """
          运行结果:
          请输入一个整数a
          未知错误invalid literal for int() with base 10: 'a'
          """

     

    4.抛出raise异常

    4.1应用场景

    • 在开发中,除了 代码执行错误 Python 解释器 抛出异常之外
    • 还可以根据 应用程序 特有的业务需求 主动抛出异常

      示例:

    • 提示用户 输入密码,如果 长度少于8,抛出异常

    4.2抛出异常

    • Python中提供一个Exception异常类
    • 在开发时,如果满足特定业务需求时,希望 抛出异常,可以:
      1. 创建 Exception 的对象
      2. 使用 raise 关键字 抛出异常
    • 需求:

      • 定义一个input_password函数,提示用户输入密码
      • 如果用户输入的密码长度<8,主动抛出异常
      • 如果用户输入的密码长度>=8,返回密码
    •  1 #抛出异常
       2 def input_password():
       3     #提示用户输入密码
       4     pwd = input("请输入密码")
       5     #判断密码长度是否>=8,如果大于返回用户输入的密码
       6     if len(pwd) >= 8:
       7         return pwd
       8     #如果<8 主动抛出异常
       9     #创建异常对象,可以使用错误信息字符串作为参数
      10     ec = Exception("密码长度不够")
      11     #主动抛出异常
      12     raise ec
      13 
      14 try:
      15     print(input_password())
      16 except Exception as result:
      17     print(result)
      18 
      19 """
      20 运行结果1:
      21 请输入密码123456
      22 密码长度不够
      23 
      24 运行结果2:
      25 请输入密码123456798
      26 123456798
      27 """
      抛出异常

    5.assert语句

    assert语句又称为 断言 ,断言表示为一些逻辑表达式,程序员相信,在程序中的某个特定点该表达式值为真,如果为假,就会触发AssertionError异常。assert语句的基本语法格式如下:

    assert 逻辑表达式 [,参数]

    逻辑上等同于:

    if not 逻辑表达式:
        raise AssertionError(参数)

    例如:

    a = 3
    assert a>5, 'a的值应该大于5'
    #如果a >= 6 程序就不会报错

     assert语句用来收集用户定义的约束条件,而不是捕获内在的程序设计错误。

  • 相关阅读:
    坦克大战(完结篇)
    坦克大战第一节——画出自己的坦克(新手篇)
    jq动画插件,自制基于vue的圆形时钟
    原生js数值开根算法
    html引入公共模块
    js组件
    前端不缓存,ajax不缓存,js操作cookie
    c++打印实心菱形,空心三角形,十字星,空心正方形,实心平行四边形
    css元素水平垂直居中
    vue日历/日程提醒/html5本地缓存
  • 原文地址:https://www.cnblogs.com/fjfsu/p/15468013.html
Copyright © 2011-2022 走看看