zoukankan      html  css  js  c++  java
  • 异常处理

    一 什么是异常

    异常指的是与正常情况不同。异常就是程序运行时发生错误的信号,在程序执行过程中,出现了错误,导致代码无法继续执行下去,就称之为异常。实例如图:

    异常的三个组成部分:异常的追踪信息、异常的类型、异常的值。

    错误的类型又分为两种,在抛出异常时又有不同。

    print("语法错误")
    a=
    
    
    
    
    
    >>>:
     File "D:/学习/old_boy_study/1.py", line 2
        a=
         ^
    SyntaxError: invalid syntax
    语法错误:当发生语法错误时,不会执行程序代码,因为这种错误无法过python解释器的语法检测。
    print("逻辑错误")
    a=[1,2,3]
    print(a[3])
    print("逻辑错误")
    
    
    >>>:
    逻辑错误
    Traceback (most recent call last):
      File "D:/学习/old_boy_study/1.py", line 3, in <module>
        print(a[3])
    IndexError: list index out of range
    逻辑错误:在错误发生前的代码都会正常执行,知道运行到发生错误的代码,抛出异常,程序结束。

    二 异常的类型

    AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
    IOError 输入/输出异常;基本上是无法打开文件
    ImportError 无法引入模块或包;基本上是路径问题或名称错误
    IndentationError 语法错误(的子类) ;代码没有正确对齐
    IndexError  索引不存在
    KeyError 试图访问字典里不存在的键
    KeyboardInterrupt Ctrl+C被按下
    NameError 使用一个还未被赋予对象的变量
    SyntaxError 语法错误
    TypeError 传入对象类型与要求的不符合
    UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
    ValueError 传入一个调用者不期望的值,即使值的类型是正确的
    
    常用异常
    异常的常用类型

    三 异常的处理

    正确处理异常的三种方式:

    1.如果能明确知道异常发生的原因,便不要产生异常,使用if判断等方式进行避免错误
    2.不知道发生异常的原因,但是知道异常的类型,那就明确捕获该类型的异常
    3.即不知道发生异常的原因,也不知道异常的类型,可以使用万能异常类型(Exception),但是必须注意一点,必须打印异常的消息。

    异常处理的8种语法:(当try中的代码参数了异常后,try中之后的代码便不会再运行,会直接跳到except中运行相应的语句)

    try:
        a=[1,2,3]
        print(a[3])
    
    except IndexError:  #捕捉一种异常类型
        print("发生了index Error")
    语法1:一个异常类型的try...except...
    语法2:try..多个except..捕捉多个类型异常
    try:
        a=[1,2,3]
        print(a[3])
        b=int('abc')
    
    except (ValueError,IndexError):
        print("发生了 ValueError  或者 IndexError")
    语法3:try..except(多个异常类型)
    try:
         # 把可能发出错误的代码放到try中
        print("start")
        # a = int("abc")
        # li[1]
        10 / 0
        dic = {}
        dic["name"]
        print("over")
    
    except Exception:
        print("可能是任何类型的错误 反正是发生错误了")
    语法4:万能异常
    try:
         # 把可能发出错误的代码放到try中
        print("start")
        # a = int("abc")
        # li[1]
        10 / 0
        dic = {}
        dic["name"]
        print("over")
    
    # 可以通过给异常取别名 来获取异常的对象  对象中包含了错误信息
    except Exception as e:
        print("可能是任何类型的错误 反正是发生错误了")
        print(e)
        print(type(e))
    语法5:万能异常,输出异常值
    # 语法6 先捕获能够明确的异常类型 最后捕获万能异常类型
    try:
         # 把可能发出错误的代码放到try中
        print("start")
        a = int("abc")
        li[1]
        10 / 0
        dic = {}
        dic["name"]
        print("over")
    except ValueError:
        print("值不对.....")
    except ZeroDivisionError:
        print("除数不能为0")
    # 可以通过给异常取别名 来获取异常的对象  对象中包含了错误信息
    except Exception as e:
        print("可能是任何类型的错误 反正是发生错误了")
    
    print("over")
    语法6:先捕获能够明确的异常类型 最后捕获万能异常类型
    try:
        a=[1,2,3]
        print(a[2])
        b=int('5')
    
    except (ValueError,IndexError):
        print("发生了 ValueError  或者 IndexError")
    else:
        print("没有发生异常")
    语法7:try...except..else,当try中的语句没有异常时,会执行else中的代码
    try:
        a=[1,2,3]
        print(a[3])
        b=int('5')
    
    except (ValueError,IndexError):
        print("发生了 ValueError  或者 IndexError")
    finally:
        print("执行了finall")
    语法8:try...expect...finally,无论try中的代码有无发生异常,都会执行finall中的代码

    finally可用于资源的回收

    四 自定义异常类

    raise关键字 

      作用:主动抛出异常,后面跟任意Exception类型的子类。

    为何要自定义异常类:

      在我们用代码敲了一个功能,提供给别人使用时,别人不按照我们所定制的要求去使用,可能会导致程序出错,而且我们无法帮助用户处理这个错误,这个时候我们使用自定义异常类,主动抛出异常,不让用户这么操作,它的操作必须严格按照我们的要求。

    class LoginException(Exception):
        pass
    
    def login():
        name=input("name>>>:").strip()
        pwd=input("password>>>:").strip()
        if name=='egon' and pwd == '123' :
            print("登陆成功")
        else:
            raise LoginException("用户名密码错误!")
    
    login()
    自定义异常的登录功能

    五 断言

      断言即断定的意思,指有一段代码需要执行必须要保证某个条件成立,否则无法执行。

    练习:

      需求:列表中有一堆数据需要被处理,但是只有当列表中有数据时才执行处理代码,否则抛出异常。

    names=[]
    if not names:
        raise TypeError("列表中没有数据")
    print("下面开始处理数据")
    print("处理数据的中。。。")
    print("数据处理完毕")
    不使用断言完成需求
    names=[]
    assert names  #当names中不为空时,执行代码,不然抛出异常
    print("下面开始处理数据")
    print("处理数据的中。。。")
    print("数据处理完毕")
    断言版
  • 相关阅读:
    DateTimePicker控件在WinXP下的BUG
    SmartAssembly .net混淆后,无法找到部分类型
    RPC_E_SERVERFAULT excel com操作错误
    System.Reflection.ReflectionTypeLoadException
    login SMTP send mail error : Unable to read data from the transport connection: net_io_connectionclosed
    静态类无法实现接口
    Combobox出现System.Data.DataRowView的原因
    .net 4.0 : Missing compiler required member 'Microsoft.CSharp.RuntimeBinder.Binder.****'
    EOS 主节点同步
    使用tcpdump抓取EOS帐户创建与交易数据
  • 原文地址:https://www.cnblogs.com/846617819qq/p/10149815.html
Copyright © 2011-2022 走看看