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

    一、异常处理

      1、异常的概念

       异常是错误发生的信号,一旦程序出错,并且程序没有处理这个错误,那个就会抛出异常,并且程序的运行随即终止。

      2、错误种类

        分两种,第一种是:语法错误,这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正。

        常见语法错误:

     #TypeError:int类型不可迭代
        for i in 3:
            pass
        #ValueError
        num=input(">>: ") #输入hello
        int(num)
    
        #NameError
        aaa
    
        #IndexError
        l=['egon','aa']
        l[3]
    
        #KeyError
        dic={'name':'egon'}
        dic['age']
    
        #AttributeError 属性错误
        class Foo:pass
        Foo.x
    
        #ZeroDivisionError:无法完成计算
        res1=1/0
        res2=1+'str'
    
        AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
        IOError 输入/输出异常;基本上是无法打开文件
        ImportError 无法引入模块或包;基本上是路径问题或名称错误
        IndentationError 语法错误(的子类) ;代码没有正确对齐
        IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
        KeyError 试图访问字典里不存在的键
        KeyboardInterrupt Ctrl+C被按下
        NameError 使用一个还未被赋予对象的变量
        SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
        TypeError 传入对象类型与要求的不符合
        UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
        导致你以为正在访问它
        ValueError 传入一个调用者不期望的值,即使值的类型是正确的
    View Code

        第二种是:逻辑错误,这是我们今天重点需要探讨的。

      3、逻辑错误的异常处理

        3.1、异常处理的意义:保证程序的健壮性与容错性,即在遇到错误时程序不会崩溃。

        3.2 、这里又可以分为两种情况

          <1>如果错误发生的条件是可预知的,我们需要用if进行处理:在错误发生之前进行预防。     

    AGE=10
    while True:
        age=input('>>: ').strip()
        if age.isdigit(): #只有在age为字符串形式的整数时,下列代码才不会出错,该条件是可预知的
            age=int(age)
            if age == AGE:
                print('you got it')
                break

          <2>如果错误发生的条件是不可预知的,则需要用到try...except:在错误发生之后进行处理。

           基本语法:

    try:
        被检测的代码块
    except 异常类型:
        try中一旦检测到异常,就执行这个位置的逻辑

          示例:

    try:
        f = open('test.txt','r',encoding='utf-8')
        print(next(f),end=' ')
        print(next(f),end=' ')
        print(next(f),end=' ')
        print(next(f),end=' ')
        print(next(f),end=' ')
        print(next(f),end=' ')
    except StopIteration:
        print('迭代出错')
    View Code

     

    二、try...except详解

      1、多分支:

        被检测的代码块抛出的异常有多种可能性,并且我们需要针对每一种异常类型都定制专门的处理逻辑。 

    s1 = 'hello'
    try:
        int(s1)
    except IndexError as e:  # 将异常信息传给变量e
        print(e)
    except KeyError as e:
        print(e)
    except ValueError as e:
        print(e)

      2、万能异常

        被检测的代码块抛出的异常有多种可能性,并且我们针对所有的处理逻辑只用一种就可以了。

    s1 = 'hello'
    try:
        int(s1)
    except Exception as e:
        print('发生异常',e)

      3、可以在多分支后来一个Exception 

    try:
        #name
        print('--->1')
        l = [1,2,3,4]
        #l[5]
        print('--->2')
        d = {}
        #d['name']
        print('---->3')
    except NameError as e:
        print('--->',e)
    except IndexError as e:
        print('--->',e)  # list index out of range
    except KeyError as e:
        print('--->',e)
    except Exception as e:
        print('万能异常检测方法')
    else:
        print('没有发生异常时执行')
    finally:
        print('不管代码块是否有异常都会执行')
    print('====== end ======')
    View Code

      4、末尾加上finally的用处

    try:
        f = open('test.txt','r',encoding='utf-8')
        print(next(f),end=' ')
        print(next(f),end=' ')
        print(next(f),end=' ')
        print(next(f),end=' ')
        print(next(f),end=' ')
        print(next(f),end=' ')
    finally:  # 资源回收时使用,不论是否发生异常都会执行
        f.close()
    View Code

      5、主动触发异常:raise,异常类型值

    class People:
        def __init__(self,name,age):
            if not isinstance(name,str):
                raise TypeError('名字必须为str类型')
            if not isinstance(age,int):
                raise TypeError('年龄必须为正整数')
            self.name = name
            self.age = age
    p = People('cc',21)

      6、自定义异常

    class EgonException(BaseException):
        def __init__(self,msg):
            self.msg=msg
        def __str__(self):
            return self.msg
    try:
        raise EgonException('类型错误')
    except EgonException as e:
        print(e)

      7、断言:assert 条件

    assert 1 == 1
    assert 1 == 2

    小结:try...except

      保证了程序的安全性,不至于一点错误就导致整个程序崩溃,将错误和正常工作分开,更容易组织代码。

      

  • 相关阅读:
    tyvj1117 拯救ice-cream
    codevs3410 别墅房间
    codevs1099 字串变换
    codevs1226 倒水问题
    codevs2449 骑士精神
    codevs1225 八数码难题
    Wikioi 3776 生活大爆炸版石头剪子布
    codevs1197 Vigenère密码
    枚举 + exgcd
    C++ 排序引用的优化
  • 原文地址:https://www.cnblogs.com/schut/p/8659899.html
Copyright © 2011-2022 走看看