码迷,mamicode.com
首页 > 其他好文 > 详细

异常处理

时间:2018-05-05 14:17:05      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:监测   没有   ext   结合   except   避免   bubuko   详解   if语句   

一、基本概念

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、自定义异常类型

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

技术分享图片

 

异常处理

标签:监测   没有   ext   结合   except   避免   bubuko   详解   if语句   

原文地址:https://www.cnblogs.com/paulwhw/p/8994462.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!