Python2.7.x 错误和异常

来源:互联网 发布:淘宝店铺号和旺旺号 编辑:程序博客网 时间:2024/06/02 21:06


错误:
1、语法错误:代码不符合解释器或者编译器语法
2、逻辑错误:不完整、不合法输入、计算出现问题

异常:执行过程中出现问题导致程序无法执行
1、程序遇到逻辑或者算法问题
2、运行过程中计算机错误(内存不够或者IO错误)

区别:
错误:
   代码运行前的语法或者逻辑错误
   语法错误在执行前修改,逻辑错误无法修改

异常分为两个步骤
1、异常产生,检查到错误且解释器认为是异常,抛出异常
2、异常处理,截获异常,忽略或者终止程序处理异常;

一、Python常见错误

错误
 描述NameError尝试访问一个没有申明的变量ZeroDivisionError除数为0SyntaxError语法错误IndexError索引超出序列范围KeyError请求一个不存在的字典关键字IOError输入输出错误(比如你要读的文件不存在)AttributeError尝试访问未知的对象属性ValueError传给函数的参数类型不正确,比如给int()函数传入字符串形

二、错误和异常的处理方式

Python完整的捕获异常的语句有点像:

    try:          try_suite      except Exception1,Exception2,...,Argument:          exception_suite      ......   #如果要处理多个异常,再写except  Exception1,Exception2,...,Argument:    else:          no_exceptions_detected_suite      finally:          always_execute_suite  

2-1.try-except : 异常处理

    try:          try_suite      except Exception [e]:          exception block  
注意:
1、如果except子句不跟任何异常和异常参数(Exception [e]),则无论try捕获了任何异常,都将交给except子句的exception block来处理。
2、except用来处理异常,如果处理异常和设置捕获异常一致,使用exception_block处理异常,否则不能捕获。

    except子句后面那个Argument其实是一个异常类的实例,包含了来自异常代码的诊断信息。也就是说,如果你捕获了一个异常,你就可以通过这个异常类的实例来获取更多的关于这个异常的信息。例如:

>>> try:...     1/0... except ZeroDivisionError,reason:...     pass... >>> type(reason)<type 'exceptions.ZeroDivisionError'>>>> print reasoninteger division or modulo by zero>>> reasonZeroDivisionError('integer division or modulo by zero',)>>> reason.__class__<type 'exceptions.ZeroDivisionError'>>>> reason.__class__.__doc__'Second argument to a division or modulo operation was zero.'>>> reason.__class__.__name__'ZeroDivisionError'
面试期间可能会问的问题,下面两个实例能获取异常吗?
try:    undefexcept:    print "catch an except"
这个是可以捕获异常的,因为是运行时错误

try:    if undefexcept:    print "catch an except"
上面这个是不能捕获异常的,因为是语法错误运行前错误

2-2.try ... except...else语句

   现在我们来说说这个else语句。Python中有很多特殊的else用法,比如用于条件和循环。放到try语句中,其作用其实也差不多:就是当没有检测到异常的时候,则执行else语句。举个例子大家可能更明白些:

try:    f = open('1.txt')    line = f.read(2)    num = int(line)except IOError, e:    print "catch IOError: " , eexcept ValueError, e:    print "catch ValueError:" , eelse:    print "No Error"

2-3.try ... finnaly

finally子句是无论是否检测到异常,都会执行的一段代码。我们可以丢掉except子句和else子句,单独使用try...finally,也可以配合except等使用。

try:    f = open('/home/changwen/1.txt')    print int(f.read())finally:    print "file close"    f.close()
如果1.txt文件内容为“test"

file close
Traceback (most recent call last):
  File "test2.py", line 3, in <module>
    print int(f.read())
ValueError: invalid literal for int() with base 10: 'test\n'

2-4.with ... as

with context_expr [as var]:      with_suite 
1.with语句用来代替try-except-finally语句,使代码更加简洁
2.context_expr表达式返回是一个对象
3.var用来保存context返回对象,单个返回值或者元组;
4.with_suite 使用var变量来对context返回对象进行操作

with open('/home/changwen/1.txt') as f:      for line in f:           print line 
上面这几行代码干了什么?
1.打开文件/home/changwen/1.txt
2.将文件对象赋值给  f
3.将文件所有行输出
4.无论代码中是否出现异常,Python都会为我们关闭这个文件,我们不需要关心这些细节。

注意,with ... as 只能确保文件最后会关闭,但如果里面有异常,还是需要对其其捕获

    使用with语句来使用这些共享资源,我们不用担心会因为某种原因而没有释放他。但并不是所有的对象都可以使用with语句,只有支持上下文管理协议(context management protocol)的对象才可以,那哪些对象支持该协议呢?如下表:file、decimal.Context、thread.LockType、threading.Lock、threading.RLock、threading.Condition、threading.Semaphore、threading.BoundedSemaphore
with语句实质是上下文管理:
  1.上下文管理协议:包含方法__enter__() 和__exit__(),支持该协议的对象要实现这两个方法
  2.上下文管理器:定义执行with语句时要建立的运行时上下文,负责执行with语句块上下文中的进入与退出操作
  3.进入上下文管理器:调用管理器__enter__方法,如果设置as var语句, var变量接受__enter__()方法返回值
  4.退出上下文管理器:调用管理器__exit__方法,

三、标准异常和自定义异常

3-1.raise语句和assert语句

raise语句用于主动抛出异常

语法格式:raise[exception[, args]]
exception : 异常类
args : 描述异常信息的元组

raise TypeError, " test error"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: test errorassert语句
断言语句:assert语句用于检测表达式是否为真,如果为假,引发AssertionError错误;

语法格式:assert expression [, args]
expression:表达式
args:判断条件的描述信息

assert 7==6, "test assert"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: test assert

3-2.标准异常和自定义异常



自定义异常:
1.python允许自定义异常用于描述python中没有涉及的异常情况;
2.自定义异常必须继承Exception类
3.自定义异常只能主动触发

#自定义异常类class FileError(IOError):    pass
可以用try ... except捕获异常

>>> try:...     raise FileError, "test fileError"... except FileError, e:...     print e... test fileError
再来一个自定义异常例子
#!/usr/bin/python2.7class CustomError(Exception):     def __init__(self, info):         Exception.__init__(self)         self.errorinfo = info         print id(self)     def __str__(self):         return "CustionError: %s" % self.errorinfotry:    raise CustomError("test CustomError")except CustomError, e:    print "ErrorInfo: %d,  %s" %(id(e), e)
changwen@ubuntu:~$ python test2.py
140242667936816
ErrorInfo: 140242667936816,  CustionError: test CustomError

0 0
原创粉丝点击