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

    1、什么是异常

      所谓程序中的异常,就是错误发生的信号,也就是说当程序出错并且程序没有处理这个错误,则会抛出一个异常,并且程序会随着这个异常终止。

    2、程序中错误的分类:

    (1)语法错误:

      语法错误,就是程序执行前必须要避免的,比如if语句后面没有冒号、关键字拼写错误等等,这样的错误一目了然,很好避免。

    (2)逻辑错误:

      逻辑错误是程序运行过程中发生的“不符合编程逻辑”的错误,具体又可以细分为如下几个:

    <1>ValueError:

    <2>NameError:

    <3>IndexError:

    <4>KeyError:

    <5>AttributeError:

    <6>ZeroDivisionError:

    <7>TypeError:

    3、异常处理的两大分类

    (1)对于可以预知的错误的发生,我们应当用if条件去判断

    (2)对于不可预知的错误,我们只知道可能发生错误的代码块,此时应当利用异常处理机制try...except 去处理

    4、try...except详解:

    (1)多分支情况:

      所谓的多分支,就是说被监测的代码抛出的异常有多种可能性,并且我们需要针对每一种异常类型都专门定制处理的逻辑。

      如上面的代码:当程序运行到 name 的时候,发现有NameError错误,于是程序自动跳到 except NameError as n:这里,并执行这里的代码。注意此时仅仅是对异常的情况进行处理,并没有终结程序,这我们可以从程序中打印出了"HelloWorld"可以验证。

       我们可以把name注释掉,此时程序没有了NameError错误,而会发现下一个IndexError错误:

      而程序也并没有终结,照样打印出来了HelloWorld。

    (2)万能异常——ExcePtion

      对于多分支情况,我们必须得知道具体异常的类型,才能“对症下药”的为每种异常进行相应的处理,而当我们不确定会发生什么异常的时候,可以用万能异常解决:

    <1>

    <2>

    (3)try..except 与finally相结合

      我们知道,当我们利用try...except语句去处理异常的时候,程序会在发生异常的地方“终结代码块”,但是我们考虑一种情况:当我们打开一个文件去处理时,在文件关闭之前发生了异常,程序跳出后我们无法关闭程序,这样会造成内存资源的浪费。针对这样的“回收资源”的应用,我们可以在整个异常处理的代码块加上finally语句,不论是否抛出异常,finally里面的代码必定会执行。说到这里大家肯定知道了,我们将文件关闭的代码写到finally下面就好了。

    try:
        f = open('whw.txt','r')
        print(next(f))
        print(next(f))
        print(next(f))
        print(next(f))
        #不知道文件中有多少行,不断去next()
    finally:
        f.close()
        #不论是否出错,文件必然会关闭

    5、主动触发异常  raise

      有时候我们需要严格限制程序的某些特性,这时候可以用raise主动去抛出异常,例如,当我们利用自定义元类控制类的创建时,规定类名必须大写,可以这样做:

      这样就利用主动触发异常实现类名的限定

    6、自定义异常类型

      顾名思义,我们需要自定义一个类来实现异常的处理:

    class MY(BaseException):
        def __init__(self,msg):
            super().__init__()
            self.msg = msg
    
        def __str__(self):
            return f"{self.msg}"
    
    try:
        print(555555)
        raise MY("666")
    except MY as e:  # 自定义异常需要自己捕获!!!
        print(e)
        import traceback
        print(traceback.format_exc())
    except Exception as e:
        print(e)
    # else:
    #     print("------------")
  • 相关阅读:
    poj 2763 Housewife Wind
    hdu 3966 Aragorn's Story
    poj 1655 Balancing Act 求树的重心
    有上下界的网络流问题
    URAL 1277 Cops and Thieves 最小割 无向图点带权点连通度
    ZOJ 2532 Internship 网络流求关键边
    ZOJ 2760 How Many Shortest Path 最大流+floyd求最短路
    SGU 438 The Glorious Karlutka River =) 拆点+动态流+最大流
    怎么样仿写已知网址的网页?
    5-10 公路村村通 (30分)
  • 原文地址:https://www.cnblogs.com/paulwhw/p/8994462.html
Copyright © 2011-2022 走看看