python异常

程序执行过程中会发生异常,影响程序的正常执行,异常也是python的对象,表示一个错误,通常的做法是捕获异常

python中捕获异常,通常使用try...except...else(finally)

常用用法,检测try语句块中的错误,使用except捕获异常并处理:

try:
<语句>        #运行别的代码
except <名字><语句>        #如果在try部份引发了'name'异常
except <名字>,<数据>:
<语句>        #如果引发了'name'异常,获得附加的数据
else:
<语句>        #如果没有异常发生
  • 如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。
  • 如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印缺省的出错信息)。
  • 如果在try子句执行时没有发生异常,python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句

使用try语句时,可以使用except不带异常类型(不太建议,不能区分出具体的异常信息)

try:
    正常的操作
   ......................
except:
    发生异常,执行这块代码
   ......................
else:
    如果没有异常执行这块代码

当然,except也可以带上多种异常类型,如下面描述:

try:
    正常的操作
   ......................
except(Exception1[, Exception2[,...ExceptionN]]]):
   发生以上多个异常中的一个,执行这块代码
   ......................
else:
    如果没有异常执行这块代码

 

另一个常用用法是finally语句,无论是否发生异常都会执行finally语句的内容

try:
<语句>
finally:
<语句>    #退出try时总会执行

当try语句出现异常,会立即执行finally块代码,finally块执行完毕,异常再次触发,执行excpet块代码

 

异常可以带上参数,可作为输出的异常信息参数,如下:

try:
    正常的操作
   ......................
except ExceptionType, Argument:
    你可以在这输出 Argument 的值...

 

可以使用raise语句自己抛出异常,

raise [Exception [, args [, traceback]]]

语句中 Exception 是异常的类型(例如,NameError)参数标准异常中任一种,args 是自已提供的异常参数

def functionName( level ):
    if level < 1:
        raise Exception("Invalid level!", level)
        # 触发异常后,后面的代码就不会再执行

用户自定义异常

通过创建一个新的异常类,程序可以命名它们自己的异常。异常应该是典型的继承自Exception类,通过直接或间接的方式。

以下为与RuntimeError相关的实例,实例中创建了一个类,基类为RuntimeError,用于在异常触发时输出更多的信息。

在try语句块中,用户自定义的异常后执行except块语句,变量 e 是用于创建Networkerror类的实例。

class Networkerror(RuntimeError):
    def __init__(self, arg):
        self.args = arg

可以触发这个异常

try:
    raise Networkerror("Bad hostname")
except Networkerror,e:
    print e.args

相关示例

(1)0不能做除数

#!/usr/bin/python
# -*- coding: UTF-8 -*-

try:
    1 / 0
except Exception as e:
    '''异常的父类,可以捕获所有的异常'''
    print "0不能被除"
else:
    '''保护不抛出异常的代码'''
    print "没有异常"
finally:
    print "最后总是要执行我"

 

不要在 try 里写返回值。 try-except-else 里都是指做某事,而不是处理返回。如果在 try 里面写返回值,则 else 部分是 unreachable 的。

 

posted on 2018-11-27 10:36  testzhangcs  阅读(160)  评论(0编辑  收藏  举报

导航