Python 错误与异常详解

1.错误和异常概念

错误

语法错误:代码不符合解释器或者编译器语法

逻辑错误:不完整或者不合法输入或者计算出现问题

异常

程序遇到逻辑或者算法问题

运行过程中计算机错误(内存不够或IO错误)

区别

错误是非正常的,是根本不应该出现的,比如缩进字符

异常是一种程序运行条件,而非严重错误,比如用户输入过大

注意

如果没有手动对异常进行处理,那么该异常就会被解释器捕获并处理,处理的方法为忽略或终止程序

2.常见错误

NameError--使用未定义的变量

SyntaxError--语法错误,常见程序格式不对。如if a后没有:

IOError--打开一个不存在的文件或文件

ZeroDivisionError--除零错误,即分母为零

ValueError--传入值无效,强制类型转换时产生。如a=int('dd')

KeyboardInterrupt--键盘中断错误,强制终止程序时产生。

3.异常处理

3.1运行前异常与运行时异常

运行前错误(在Python解释器将代码转换为字节码的过程中发现的错误,不可被try-except捕获到

    SyntaxError

运行时错误(程序运行起来才可以发现的错误,可被try-except捕获到)

    NameError、IOError、ValueError

3.2try-except-else-finally语句

3.2.1注意点

         如果except后不跟异常类,则表示捕获所有异常

         如果try捕获到try_suite中的异常属于某一个except后跟的异常类,那么就会执行该except的exception_block,如果都不属于,就会交给解释器。

         finally块的作用:无论是否有异常,都会执行finally块,所以finally块是为异常处理事件提供清理机制,常用来关闭文件或释放系统资源

3.2.2执行顺序

         如果try_suite中没有异常,那么先执行else块,然后执行finally块

         如果try_suite中有异常,那么先执行except块,然后执行finally块,且如果该异常不属于任何一个except所定义的异常,也会先执行finally块,再交给解释器处理

3.2.3语句格式

try:

    try_suite

except [Exception1 [,e]]:

    exception_block1

except [Exception2 [,e]]:

    exception_block2

...

except [ExceptionN [,e]]:

    exception_blockN

else:

    none_execption

finally:

    do_finally

4.with...as语句与上下文管理

格式

with context [as var]:

    with_suite

作用

只是用来代替try-finally语句,不常用

context表达式返回的是一个对象

var用来保存context表达式返回的对象

with_suite使用var变量来对context返回的对象进行操作

原理

with语句是指上下文管理

上下文管理协议:包含__enter(self)和__exit__( self,exc_type,exc_value,traceback)两个方法,支持该协议的对象要实现这两个方法

上下文管理器:定义执行with语句时要建立的运行时上下文,负责执行with语句块上下文中的进入和退出操作

进入上下文管理器:调用管理器__enter__()方法,如果设置as var语句,则var变量接收__enter__()方法返回值

退出上下文管理器:调用管理器__exit__()方法。注意,如果with_suite中有异常,则先回调用__exit__()方法,然后才会交给解释器处理

自定义上下文管理器

 1 class Mycontext(object):
 2 
 3          def __init__(self,name):
 4 
 5                    self.name=name
 6 
 7         
 8 
 9          def __enter__(self):
10 
11                    print "__enter__"
12 
13                    return self
14 
15         
16 
17          def __exit__(self,exc_type,exc_value,traceback):
18 
19                    print "__exit__"
20 
21                    print "***********************"
22 
23                    print "Error:",exc_type
24 
25                    print "info:",exc_value
26 
27                    print "traceback:",dir(traceback)
28 
29                    print "***********************"
30 
31  
32 
33 if __name__ == '__main__':
34 
35          with Mycontext('test context') as f:
36 
37                    print f.name
38 
39                    a
自定义上下文管理器举例

5. raise和assert语句

5.1raise语句

5.1.1作用

用于主动抛出异常

5.1.2格式

raise exception[, args]

5.1.3参数

exception--异常类

args--附带信息

5.1.4举例

raise NameError,11

raise NameError,"tttt"

raise NameError,('11','22')

raise NameError,['11','22']

raise NameError,{'11','22'}

5.2assert语句

5.2.1作用

用于检测一个表达式是否为真,如果为假,引发AssertionError错误

5.2.2格式

assert expression[, args]

5.2.3参数

expression--表达式

args--附带信息

5.2.4举例

assert 0,'ttt'

assert 1,'ttt'

assert 1==2 , 11

assert 1==2,"tttt"

assert 1==2,('11','22')

assert 1==2,['11','22']

assert 1==2,{'11','22'}

6. 标准异常和自定义异常

6.1标准异常

6.1.1定义

Python内建异常,程序执行前就已经存在

 

6.1.2官网

https://docs.python.org/2/library/exceptions.html

6.2自定义异常

6.2.1前提

自定义异常必须继承于Exception类或其子类

自定义异常只能主动触发

6.2.2格式

# -*- coding:utf8 -*-
exception_dict={
         'FileNotExistException':u'文件不存在异常'
}
class YcException(Exception):
         def __init__(self, exception_type):
                   super(YcException,self).__init__()
                   self.exception_type=exception_type
try:
         raise YcException(exception_dict['FileNotExistException'])
except YcException as e:
         print e.exception_type
自定义异常格式举例

6.2.3触发

raise 自定义异常名,附加信息

posted @ 2017-11-10 07:09  yc紫日  阅读(703)  评论(0编辑  收藏  举报