当一个小人物冲向大时代,有多少伤害埋伏左右; -- 北岛《城门开》
当一个大梦想埋于小身体,有多少潜能冲破束缚。 -- 小 Q 《梦想家》
----------------------------------------------------------------------------------------------
【简 介 异 常】
异 常 是 什 么
异常是一个事件,该事件在执行过程中发生,影响了程序正常执行。异常是 python 对象,表示一个错误。而我们要做的事发生异常后捕获并处理它,否则程序会终止。
- try: < 语句 > #运行别的代码 except < name > : < 语句 > #如果在
- try部份引发了'name'异常 except < name > , < 数据 > : < 语句 > #如果引发了'name'异常,获得附加的数据
- else: < 语句 > #如果没有异常发生
工 作 原 理
当 try 开始后,python 在当前程序的上下文做标记,当异常出现时就回到这里,try 子句先执行,接下来发生的事依赖于出现什么异常。
1、try 子语句执行后发生异常,python 去逐个匹配 except 子句,匹配并处理完毕,控制流就通过了整个 try 语句(除非期间又发生了新的异常)
2、try 子语句发生异常后,没有匹配到 except 子句,异常呗递交到上层 try,或者程序最上层,然后结束程序,打印缺省值
3、try 子语句没有发生异常,python 将执行 else 语句后的语句,然后通过整个 try 语句
【五 类 异 常 】
使用 except 带有 IOError 异常
- # ! /usr/bin / python# - *- coding: UTF - 8 - *-
- try: fh = open("testfile", "w") fh.write("这是一个测试文件,用于测试异常!!") except IOError: print "Error: 没有找到文件或读取文件失败"
- else: print "内容写入文件成功" fh.close()
>>>> python test.py // 输出如下
内容写入文件成功
cat testfile # 查看写入的内容
这是一个测试文件,用于测试异常!!
chmod -w testfile
>>>> python test.py // 输出如下
Error: 没有找到文件或读取文件失败
使用 except 不带任何异常
- try: 正常的操作 ......................except: 发生异常,执行这块代码 ......................
- else: 如果没有异常执行这块代码
以上方式,不论发生什么异常,都会执行 except 子语句;这不是好方式,我们不能识别其具体异常。
使用 except 带多种异常类型
- try: 正常的操作 ......................except(Exception1[, Exception2[, ...ExceptionN]]]) : 发生以上多个异常中的一个,执行这块代码 ......................
- else: 如果没有异常执行这块代码
try-finally 语 句
try-finally 语句无论是否发生异常都将执行最后的代码。
- try: < 语句 >
- finally: < 语句 > #退出
- try时总会执行
- # ! /usr/bin / python# - *- coding: UTF - 8 - *-
- try: fh = open("testfile", "w") fh.write("这是一个测试文件,用于测试异常!!")
- finally: print "Error: 没有找到文件或读取文件失败"
>>>> python test.py // 输出如下,提前将 testfile 设为不可写
Error: 没有找到文件或读取文件失败
cat testfile
这是一个测试文件,用于测试异常!!
- try: fh = open("testfile", "w")
- try: fh.write("这是一个测试文件,用于测试异常!!")
- finally: print "关闭文件" fh.close() except IOError: print "Error: 没有找到文件或读取文件失败"
>>>> python test.py // 输出如下,提前将 testfile 设为不可写
关闭文件
cat testfile
这是一个测试文件,用于测试异常!!
Argument 异 常
一个异常可以带上参数,可作为输出的异常信息参数。
你可以通过 except 语句来捕获异常的参数,如下所示:
- try: 正常的操作 ......................except ExceptionType,
- Argument: 你可以在这输出 Argument 的值...
变量接收的异常值通常包含在异常的语句中。在元组的表单中变量可以接收一个或者多个值。
元组通常包含错误字符串,错误数字,错误位置。
- # ! /usr/bin / python# - *- coding: UTF - 8 - *-# 定义函数def temp_convert(var) :
- try:
- return int(var) except ValueError, Argument: print "参数没有包含数字\n",
- Argument# 调用函数temp_convert("xyz");
>>>> python test.py // 输出如下
参数没有包含数字
invalid literal for int() with base 10:'xyz'
raise 触 发 异 常
raise [Exception [, args [, traceback]]]
Exception 是异常的类型(例如:NameError)
args 是一个异常参数值,不提供默认为 None
traceback 参数可选 (很少用),追踪异常对象 #!/usr/bin/python
- # - *- coding: UTF - 8 - *-# 定义函数def mye( level ) :
- if level < 1 : raise Exception("Invalid level!", level) # 触发异常后,后面的代码就不会再执行
- try: mye(0) // 触发异常
- except "Invalid level!": //为了能捕获异常,"except"语句必须有用相同的异常来抛出类对象或者字符串
- print 1
- else: print 2
>>>> python test.py // 输出如下
Traceback (most recent call last):
File "test.py", line 11, in
mye(0)
File "test.py", line 7, in mye
raise Exception("Invalid level!", level)
Exception: ('Invalid level!', 0)
自 定 义 异 常
创建一个新异类,程序命名他们自己的异常,异常应是典型的集成 Exception 类;
以下为与 RuntimeError 相关实例,实例中创建了基类 RuntimeError,用于异常触发时输出更多信息;
try 语句块中,用户自定义异常后执行 except 块语句,变量 e 用于创建 Networkerror 类的实例。
- class networkerror(RuntimeError) : def __init__(self, arg) : self.args = arg
- try: raise networkerror("bad hostname") except networkerror,
- e: print e.args print 111
>>>> python test.py // 输出如下
('b', 'a', 'd', '','h','o','s','t','n','a','m','e')
111
----------------------------------------------------------------------------------------------
来源: http://www.bubuko.com/infodetail-1862762.html