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

Python异常

2015-12-09 14:04 501 查看

异常的处理

异常是指程序中的例外,违例情况;
在Python3中,BaseException是所以异常的基类,所以的内置异常都是它的派生类;
Exception是除了SystemExit,GeneratorExit和KeyboardInterrupt之外的所有内置异常的基类,用户自定义的异常也要继承它;
Python内的异常使用继承结构创建,可以在异常处理程序中捕获基类异常,也可以捕获子类异常;

*StopItertion 当迭代器中没有数据项时触发,由内置函数next()和迭代器的__next__()方法触发
*ArithmeticError 算法异常基类,包括OverflowError(溢出异常),ZeroDivisionError(零除异常),FloatingPointError(失败的浮点数操作)
*AssertionError assert语句失败时触发
*AttributeError 属性引用和属性赋值异常
*BufferError 缓存异常,当一个缓存相关的操作不能进行时触发
*EOFError 未见末尾,使用内置函数input()生成,标识到达文件末尾。但是如read()和readline()等大多数I/O操作将返回一个空字符串来表示EOF而不是引发异常
*ImportError 导入异常,当import语句或者from语句无法在模块中找到相应文件名称时触发
*LookupError 当使用映射或者序列时,如果键值或者索引无法找到的时候触发——(KeyError和IndexError的基类)
*MemoryError 内存错误,当操作超出内存范围时触发
*NameError 名称异常,在局部或者全局空间中无法找到文件名称时触发
*OSError 当一个系统函数返回一个系统相关的错误时触发
*ReferenceError 引用异常,当底层的对象呗销毁后访问弱引用是触发
*RuntimeError 包含其他分类中没有被包括进去的一般错误
*SyntaxError 语法错误
*SystemError 编译器的内部错误
*TypeError 类型异常,当操作或者函数应用到不合适的类型时触发
*ValueError 值异常,当操作或者函数的类型正确,但是值不正确时触发
*Warning 警告

try...except

try...except语句用于处理问题语句,捕获可能出现的异常;
try子句中的代码块放置可能出现异常的语句,except子句中的代码块处理异常;
当异常出现时,python会自动生成1个异常对象,包含异常的具体信息;
如:
open("hello.txt","r")
Traceback (most recent call last):
File "C:\Users\cs\Desktop\hello.py", line 1, in <module>
open("hello.txt","r")
FileNotFoundError: [Errno 2] No such file or directory: 'hello.txt'


使用try...except语句:
try:
open("hello.txt","r") #尝试读取一个不存在的文件,如果出现异常直接跳入except
print("读文件")
except FileNotFoundError: #捕捉FileNotFoundError异常
print("文件不存在")
except:                   #其他异常情况
print("程序异常")

输出结果:
文件不存在


try:
result = 10/0
except ZeroDivisionError:
print("0不能被整除")
else:
print(result)

#如果result表达式为10/2,则异常不会发生,else子句将被执行


异常嵌套:
try:
s = "hello"
try:
print(s[0] + s[1])
print(s[0] - s[1])
except TypeError:
print("字符串不支持减法运算")
except:
print("异常")

输出结果:
he
字符串不支持减法运算
如果外层try子句中的代码块引发异常,程序直接跳转到外层对应的except子句
try...except嵌套语句通常用于释放已经创建的系统资源

try...finally

无论异常是否发生,finally子句都会被执行;
所有finally子句通常用于关闭因异常而不能释放的系统资源;
try中的变量是局部变量;
try:
f = open("hello.txt","r")
try:
print(f.read(5))
except:
print("读取文件错误")
finally:
print("释放资源")
f.close()
except FileNotFoundError:
print("文件不存在")

输出结果:
文件不存在


使用raise抛出异常

raise可以显示引发异常,一旦执行了raise语句,raise后面的代码将不能被执行;
raise语句通常用于抛出自定义异常,因其不再python的控制范围内,不会被python自动抛出
try:
s = None
if s is None:
print("s是空对象")
raise NameError
print(len(s))
except TypeError:
print("空对象没有长度")

输出结果:
s是空对象
Traceback (most recent call last):
File "C:\Users\cs\Desktop\hello.py", line 5, in <module>
raise NameError
NameError


自定义异常

Python运行程序媛自定义异常类型,用于描述Python异常体系中没有涉及的异常情况;
自定义异常必须继承Exception类,按照命名规范以Error结尾,显示告诉程序媛该类是异常类;
自定义异常使用raise语句引发

from __future__ import division

class DivisionException(Exception):
def __init__(self,x,y):
Exception.__init__(self,x,y)
self.x = x
self.y = y

if __name__ == "__main__":
try:
x = 3
y = 2
if x%y > 0:
print(x/y)
raise DivisionException(x,y) #注释此行DivisionException异常不会触发
except DivisionException.div:  #div表示DivisionException类的实例对象
print("DivisionException:x/y = %.2f"%(div.x/div.y))

输出结果:
1.5
Traceback (most recent call last):
File "C:\Users\cs\Desktop\hello.py", line 15, in <module>
raise DivisionException(x,y) #注释此行DivisionException异常不会触发
DivisionException: (3, 2)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "C:\Users\cs\Desktop\hello.py", line 16, in <module>
except DivisionException.div:  #div表示DivisionException类的实例对象
AttributeError: type object 'DivisionException' has no attribute 'div'


assert语句

assert语句用于检测某个表达式是否为真;
又称断言语言,即assert认为检测的表达式永远为真;
t = ("hello",)
assert len(t) >= 1
t = ("hello")
assert len(t) ==1

输出结果:
Traceback (most recent call last):
File "C:\Users\cs\Desktop\hello.py", line 4, in <module>
assert len(t) ==1
AssertionError
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: