python异常处理

来源:互联网 发布:阜阳市工商局网络监管 编辑:程序博客网 时间:2024/06/02 04:14

python异常处理

1. python的异常:

python用异常对象(exeption object)来表示异常。如果异常对象并未被捕捉后,程序会终止执行并抛出异常(使用Traceback显示)。

pythonexceptions中定义了大量的异常类型,在使用时import导入即可。大家可以使用dir函数查看exceptions中的类型,类型有很多。通常,我们最常用的两个基类是:BaseException(所有异常的基类),Exception(通用的异常类)

 

2. 异常的抛出机制:

(1)如果在运行时发生异常,解释器会查找相应的处理语句(成为handler);

(2)若是在当前的函数里没有找到,它会将异常传递给上层的调用函数,看看是否有处理异常的机制;

(3)如果在最外层(全局main)还是没有找到的话,解释器就会退出,同时打印出traceback以便让用户找到错误产生的原因。

 

3. try捕捉异常:

  对于异常的处理,可以使用tryexceptelsefinally进行捕捉。try语句会在当前程序的上下文中做标记,当异常出现时,就可以回到这里。

try:    statement1 (正常业务代码)except Exception_class, msg:    statement2 (捕获特定异常,或所有异常。异常处理逻辑)else:    statement3 (异常未捕捉到的)finally:    statement4 (不管异常有没有发生,都执行部署)

(1)except后跟了两个变量,前者是异常类型,后者是异常对象,包含了异常信息。在新版本中的写作,经常写成:except Exception_class as ex(建议写为这种)

(2)异常发生时,如果except没有捕捉到异常,那么会进入else继续进行处理;

(3)在执行try语句时,可以尝试按ctrl+c触发异常退出,此时,finally语句依然可以被执行到。其实,finally中的语句,不论有没有异常,都会执行到


3. raise抛出异常:

  在实际语句中,可以使用raise命令主动抛出对应的异常。简单的命令格式为:

raise Exception(args [, traceback])

     当然,也可以抛出自定义的异常


4. 用户自定义异常

通过继承异常基类而创建一个新的异常类,在新的异常里面可以自定义异常信息,可以更方便、准确的捕捉到错误,增加程序可读性。

比如,实际进行异常处理写作时,可以按照如下方式定义:

1)编辑message.py,定义信息显示的标准宏定义;

__author__ = 'acer'#-*- coding: utf-8 -*-#!/usr/bin/pythonNOT_FOUND_ERROR = "Not Found Resource!"


2)编辑exceptions.py,定义各种新的异常类(使用message.py信息):

from common.messages import *class APIException(Exception):    def __init__(self, status="", error_code="", message=NOT_FOUND_ERROR):        Exception.__init__(self)        self.message = message        self.status = status        self.error_code = error_code        pass    def __str__(self):        return "An Error Occured: Status: %s; Error_code: %s; Msg: %s" %\               (self.status, self.error_code, self.message)

3)主动抛出对应的异常

from common import exceptionsdef main():    a = "abc"    try:        b = int(a)    except Exception as ex:        raise exceptions.APIException(status="404", error_code="wrong")if __name__ == "__main__":    main()


4)执行结果:

Traceback (most recent call last):  File "E:/03_编程/01_程序脚本/tools/test/TestException.py", line 15, in <module>    main()  File "E:/03_编程/01_程序脚本/tools/test/TestException.py", line 12, in main    raise exceptions.APIException(status="404", error_code="wrong")common.exceptions.APIException: An Error Occured: Status: 404; Error_code: wrong; Msg: Not Found Resource!

可以看出,新增异常类的信息正常的抛出了。

 

5. 文件打开异常与with命令

一般,我们在打开文件的时候,简单流程如下:

fd = open(“test.txt”, “r”)contents = fd.readlines()......fd.close()

但是如果我们在处理过程,不小心持有了文件的句柄,导致文件未被正常的释放,可能导致其它命令无法正常的访问到这里。

于是就有了:

try:    fd = open(“test.txt”, “r”)    contents = fd.readlines()    ...处理    fd.close()except:    fd.close()

   但是pythonwith给我们提供了很好的解决方案,这就是:

with open(“test.txt”, “r”) as fd:    contents = fd.readlines()

这样,即使没有正常的处理,也能很好的释放掉文件句柄。

   有了with这个强大的语法,我们就不限于打开文件了,针对更常见的方式,可以去封装,有了另外一种更加合理便利的写法:

def cdir(path):    pre = os.getcwd()    os.chdir(path)try:    yieldfinally:    os.chdir(pre)with cdir(“/home”):    do something……

with为我们提供了极大的便利,可以方便的让我们进行编程及实现。

 

原创粉丝点击