欢迎来到我的博客园

python学习[第十六篇] 异常

python学习[第十六篇] 异常

python中的异常

NameError 尝试访问一个未声明的变量

ZeroDivisionError 除数为0

SyntaxError pyhton解释器语法错误

IndexError 索引超出范围

KeyError 请求一个不存在的字典关键字

IOError 输入输出错误

AttributeError 尝试访问未知的对象属性

#NameError
>>> i
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'i' is not defined

#ZeroDivisionError
>>> 1/0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero

#SyntaxError
>>> x=2
>>> x++
  File "<stdin>", line 1
    x++
      ^
SyntaxError: invalid syntax

#IndexError
>>> x=[1]
>>> x[2]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

#KeyError
>>> x={1:2}
>>> x[2]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 2

#IOError
>>> x=open('a')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'a'

#AttributeError
>>> x.__ooo___
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'dict' object has no attribute '__ooo___'

检测和处理异常

异常通过try方法来捕获

主要有两种方式:try-except 和try-finally。一个try语句可以对应多个except语句,但只能对应一个finally语句,或是一个try-except-finally语句。

try-except语句

#一个except 只处理一个Exception
try:
    try_suite
except Exception,[reason]:
    except_suite
#一个except 处理多个Exception
try:
    try_suite
except Exception1,[exception2],...,[exceptionN],[reason]:
    except_suite
# 多个except处理多个Exception
try:
    try_suite
except Exception1,[exception2],...,[exceptionN],[reason]:
    except_suite
except Exception1,[exception2],...,[exceptionN],[reason]:
    except_suite
except Exception1,[exception2],...,[exceptionN],[reason]:
    except_suite

捕获所有的异常

python 异常结构

  • BaseException
  •     |-----KeyboardInterrupt
  •     |-----SystemExit
  •     |-----Exception
  •         |-----(all other current built-in exception)
try:
    try_suite
except Exception,e:
    except_suite
try:
    try_suite
except BaseException:
    except_suite

异常参数

我们可以在except 语句后面加一个参数,参数会包含来自导致异常的代码诊断信息。是一个类的实例。

>>> try:
...     f=open('test.txt','r')
... except IOError,e:
...     type(e)
...     print e
...
<type 'exceptions.IOError'>
[Errno 2] No such file or directory: 'test.txt'

 

else子句

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

>>> try:
...     x='ttt'
... except Exception,e:
...     print e
... else:
...     print x
...
ttt

 

finally子句

finally子句无论异常是否会发生,都会执行finally子句。try必须有一个except ,else和finally 可有可无。

try:
    A
except:
    B
else:
    C
finally:
    D

 

触发异常

python使用raise来触发异常

异常和sys模块

我们可以通过sys模块中的exc_info()函数来获取异常信息。此功能返回一个3元组

>>> try:
...     float('test')
... except:
...     import sys
...     exc_typle=sys.exc_info()
...     print exc_typle
...
(<type 'exceptions.ValueError'>, 
ValueError('could not convert string to float:test',),
 <traceback object at 0x02619990>)

 

posted @ 2018-07-27 11:05  panzq  阅读(166)  评论(0编辑  收藏  举报