您的位置:首页 > 编程语言 > Python开发

Python3学习笔记(4)——异常处理

2017-08-16 22:59 260 查看

1    异常处理

1.1   try-except语句

异常发生时,剩余代码忽略,解释器搜索异常处理器,若没找到处理器,则将异常向上移交给调用者的try中去处理,直到找到合适的处理器。若到顶层仍未找到,则认为是未处理的异常,显示跟踪信息,然后退出。

因此,不需要在每个可能出错的地方去捕获错误,只要在合适的层次去捕获错误就可以了。

try-except语句1

try-except语句——处理多个异常

try:

    try_suite #监控此处异常

except Exception1 [, reason1]:

    except_suite1 #异常处理器1

except Exception2 [, reason2]:

    except_suite2 #异常处理器2

try:

    try_suite #监控此处异常

except (Exception1, Exception2...)[, reason]:

    [except_suite #异常处理器]

   

Exception2若是Exception1的子类,则无法捕获。

不要写【except:】来捕获所有异常。可以捕获特定异常并忽略它们, 或是捕获所有异常并采取特定的动作.

使用 pass 忽略某异常,会返回None。

1.2   异常参数reason

reason是一个元组,和异常类实例的args属性绑定。对于大多内建异常(从 StandardError 派生的异常), 这个元组只包含一个指示错误原因的字符串。

异常处理即使用pass忽略,reason也保留了异常信息。

调用str(reason)增加可读性(其实是调用类的__str__()方法),作为异常信息返回。

1.3   raise关键字

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

允许程序员强制抛出一个指定的异常。可以在except中重新抛出异常,供调用者处理。

raise Exception('error','xxx') 或 raise Exception, ('error','xxx')

#初始化一个异常类,多个参数接收为元组,传递给该对象的args属性。

执行raise语句时,Python会创建指定的异常类的一个对象。raise语句还可指定对异常对象进行初始化的参数。为此,在异常类的名称后添加一个逗号以及指定的参数(或者由参数构成的一个元组),即args。

1.4   异常继承关系

BaseException

Exception

错误条件引起的异常

KeyboardInterrupt

按下了 CTRL-C (^C) , 想要关闭 Python

SystemExit

由于当前 Python 应用程序需要退出

(all other current built-in exceptions) 所有当前内建异常

1.5   try的其它子句

1.5.1   else子句

在try 范围中没有异常被检测到时,执行else 子句。

1.5.2   try-finally语句

用来维持一致的行为。无论try中是否发生异常,finally都会执行。

当在try范围中产生一个异常时,会立即跳转到finally语句段.当finally中的所有代码都执行完毕后,会继续向上一层引发异常(finally 会自动的重新引发异常).

①可以嵌套语句:try(try-except)-finally,简化为try-except-finally

②或try(try-finally)-except来捕获finally中的异常(但是finally在异常处理之前执行,不是最后执行清理工作)

1.5.3   try-except-else-finally语句

1.6   with语句和上下文管理器

with context_expr [as var]:

     with_suite

with open('/etc/passwd', 'r') as f:

     for eachLine in f:

         # ...do stuff with eachLine or f...

完成准备工作,若正常则把文件对象赋给f。无论是否发生异常,都会执行清理工作。

with所求值的对象必须是一个上下文管理器。

上下文管理器(Context Manager)是支持上下文管理协议的对象,这种对象实现了__enter__(self)和 __exit__(self,type,value,trace):

1.6.1   __enter__(self)方法

with后的上下文管理器调用__enter__()方法,如果使用了 as 子句,该方法的返回值赋给as后边的变量(可以是元组)。

1.6.2   __exit__(self,type,value,trace)

self:对象引用。type:异常类。value:异常信息。trace: 错误追踪。

当with后边代码执行完成后,不管是否执行过程中是否发生了异常,都会调用前边对象的__exit__()方法。

如果执行过程中没有出现异常,或者语句体中执行了语句 break/continue/return,则以 None 作为参数调用__exit__(None, None, None) ;如果执行过程中出现异常,则使用 sys.exc_info 得到的异常信息为参数调用__exit__(exc_type, exc_value, exc_traceback)

如果 __exit__() 返回 True,则异常被忽略,如果返回False,则重新抛出异常,由外层代码对异常进行处理。

1.6.3   相关模块contextlib

为使用with 语句的上下文对象工具

1.7   自定义异常

classMyError(Exception):

    def __init__(self,val):

             self.myVal=val

    def __str__(self):

             return repr(self.value)

raiseMyError('error')

1.8   断言assert

assert expression[, arguments]

# 若表达式expression不成立,则引发AssertionError异常,输出arguments信息。

可将assert语句放在try语句块中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: