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

Python基础概念_10_异常处理

2017-06-16 09:30 609 查看

异常处理

11 异常处理

11.1 简介

程序是在某个条件下实现某个功能的指令集,如果执行的环境发生了变化那么程序可能会出异常。比如实现一个打开文件的功能,我们在上章里都是直接打开文件,但实际执行时文件可能不存在。如果对这个异常我们没有做处理,那么python会帮我们处理,不过显然系统给的系统对用户来说不是很友好,可读性不高。而且在没有加异常捕获时,程序遇到异常就终止了。所以一般我们都要对异常进行捕获,让程序更健壮,能适应各种异常的情况。

 

 

程序异常示例:

 

f =open("G:\\tmp\\xiaodao1.txt", "r") 

f.read() 

print("继续执行呢!")

 

执行结果:

Traceback (mostrecent call last):

  File "FileOperate.py", line 20, in<module>

    f = open("D:\\tmp\\xiaodao1.txt","r")

FileNotFoundError:[Errno 2] No such file or directory: 'D:\\tmp\\xiaodao1.txt'

 

注:此例中如下的代码在遇到异常时将不会被执行:

f.read() 

print ("继续执行呢!")

11.2 处理异常

处理异常又成异常捕获,一般我们是通过try/except语句。该语句是用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。这样当我们的程序出现异常并捕获到后程序还是会继续执行。所以上节的代码我们修改如下:

 

try:

    f = open("G:\\tmp\\xiaodao1.txt","r") 

    f.read() 

exceptIOError:

    print ("Error: 没有找到文件或读取文件失败")

   

print("尽管有异常,捕获后会继续执行呢!") 

 

执行结果:

Error: 没有找到文件或读取文件失败

尽管异常,捕获后会继续执行呢!

 

如上是个捕获异常的简单例子,接下来我们结合try/except的语法来详细介绍下异常捕获的常用处理处理方法。

11.2.1 tryexcept else语句

语法见下:

try:

    Normal execution block(代码块)

except A:

     Exception A handle(异常A的具体处理方法)

except B:

    Exception B handle(异常B的具体处理方法)

except:

    Other exception handle(其它异常的具体处理方法)

else:

     if no exception,get here(如果没有异常则处理)

finally:

    final execution block (不论是否异常都会被执行到) 

 

执行顺序说明:

正常时程序会执行try里面的Normal execution block,当出现异常时,则会中断当前Normalexecution block中的执行跳转到对应的异常处理块里执行异常处理的代码。python从第一个except X处开始查找,如果找到了对应的exception类型则进入该异常里的处理。如果没有找到则直接进入except块处进行处理。

 

注:

1)  上面语法里的except块是个可选项,如果代码里没有出现,该异常将会被提交给python进行默认处理,处理方式则是终止应用程序并打印提示信息。

2)  异常里的代码执行顺序是 try-->exceptX-->except-->else-->finally。其中except是except X没找到时执行,else是没有异常时执行,finally是无论有没有异常都会执行。

 

代码示例:

 

如下是个键盘接受用户输入的程序

try:

    text = input('请输入些单词')

exceptEOFError:

    print('你为什么输入个EOF(windows里按ctrl+z,linux里是ctrl+c)给我?')

exceptKeyboardInterrupt:

    print('你输出了取消键ctr+c')

else:

    print('你输入了 {0}'.format(text))

finally:

    print('无论是否异常最终都会被执行finally!')

 

执行结果:

1)      场景一输入ctrl+z模拟程序终止

请输入些单词:^Z

你为什么输入个EOF(windows里按ctrl+z,linux里是ctrl+c)给我?

无论是否异常最终都会被执行finally!

2)      场景二输入ctrl+c模拟终止输入

请输入些单词:

你输出了取消键ctr+c

无论是否异常最终都会被执行finally!

 

3)      场景三正常输入hello xiaodao

请输入些单词:hello xiaodao

你输入了 hello xiaodao

无论是否异常最终都会被执行finally!

 

11.2.2 tryexcept语句

该异常捕获语句是上述完整语句的简化版。

 

代码示例:

 

如下是个键盘接受用户输入的程序

try:

    text = input('请输入些单词:')

except:

    print('你的输入有误')

else:

    print('你输入了 {0}'.format(text))

finally:

    print('无论是否异常最终都会被执行finally!')   

 

执行结果:

 

1)      场景一输入ctrl+z模拟程序终止

请输入些单词:^Z

你的输入有误

无论是否异常最终都会被执行finally!

2)      场景二输入ctrl+c模拟终止输入

请输入些单词:

你的输入有误

无论是否异常最终都会被执行finally!

3)      场景三输入hello world

请输入些单词:hello world

你输入了 hello world

无论是否异常最终都会被执行finally!

 

如果你想查看异常的详细原因,还可以将异常记录到一个文件里。修改后的代码见下:

 

 

改善后代码:

importtraceback

try:

    text = input('请输入些单词:')

except:

    print('你的输入有误,详细错误信息,请查看c:\\inputerror.txt')

    f=open("c:\\inputerror.txt",'a') 

    traceback.print_exc(file=f) 

    f.flush() 

    f.close()

else:

    print('你输入了 {0}'.format(text))

finally:

    print('无论是否异常最终都会被执行finally!')

 

执行结果:

请输入些单词:^Z

你的输入有误,详细错误信息,请查看c:\inputerror.txt

无论是否异常最终都会被执行finally!

 

通过查看c:\inputerror.txt里的内容,我们知道这里是个EOFError。

Traceback (mostrecent call last):

  File "FileOperate.py", line 115, in<module>

    text = input('请输入些单词:')

EOFError

 

11.2.3 tryfinally语句

该语句没有对异常进行处理,即无论是否有异常都会正常执行但异常会被python捕获到并终止程序。

try:

    text = input('请输入些单词:')

finally:

    print('无论是否异常最终都会被执行finally!')

print("程序异常后将不会执行,反之会显示")

 

执行结果:

 

1)      场景一输入ctrl+z模拟程序终止

请输入些单词:^Z

无论是否异常最终都会被执行finally!

Traceback (mostrecent call last):

  File "FileOperate.py", line 129, in<module>

    text = input('请输入些单词:')

EOFError

 

注:这里出现异常,最后一行的print函数没有再执行。

 

2)      场景一输入hello world

请输入些单词:hellow world

无论是否异常最终都会被执行finally!

程序异常后将不会执行,反之会显示

 

注:不建议这样使用try except和try finally方式捕获异常,因为更细分的异常没有个个捕获。

11.3 抛出异常

如果我们知道程序中会有一个很显著的异常时可以使用 raise 语句抛出它。比方0不能做分母。

 

代码示例:

defdivide(x, y):

    if y == 0 : 

        raise ZeroDivisionError('The zero is notallow') 

    return x / y

a=input("请输入个数字:")

b=input("请输入另外个数字:")

print("除法结果:\t"+str(divide(int(a),int(b))))

 

执行结果:

1)      场景一输入0作为分母

请输入个数字:10

请输入另外个数字:0

Traceback (most recent call last):

  File"FileOperate.py", line 159, in <module>

    print("除法结果:\t"+str(divide(int(a),int(b))))

  File"FileOperate.py", line 155, in divide

    raiseZeroDivisionError('The zero is not allow')

ZeroDivisionError:The zero is not allow

 

2)      场景二输入正常的数字

请输入个数字:10

请输入另外个数字:20

除法结果:       0.5

 

 

 

11.4 自定义异常

自定义异常是通过创建一个新的exception类来拥有自己的异常。异常通过需要继承自 Exception 类。

 

代码示例:

 

这里定义了一个自己的异常,会记录外部传来的value值。主程序里当输入数字小于10时触发自定义异常。

classMyError(Exception):

        def __init__(self, value):

            self.value = value

        def __str__(self):

            return repr(self.value)

       

a=input("pleaseinput a num:")

ifint(a)<10:

    try:

        raise MyError(a)

    except MyError as e:

         print('我自定义的异常触发了,输入的value小于10,它的值是:', e.value)

else:

    print("查询正常执行!")

 

执行结果:

1)      场景一输入5

 

please input a num:5

我自定义的异常触发了,输入的value小于10,它的值是: 5

2)      场景二输入15

please input a num:18

查询正常执行!

 

11.5 系统定义异常

Python预定义了些常用的异常,一般我们叫它系统定义异常。这些异常的详细信息见下表的说明:

 

异常名称

描述

BaseException

所有异常的基类
SystemExit

解释器请求退出
KeyboardInterrupt

用户中断执行(通常是输入^C)
Exception

常规错误的基类
StopIteration

迭代器没有更多的值
GeneratorExit

生成器(generator)发生异常来通知退出
StandardError

所有的内建标准异常的基类
ArithmeticError

所有数值计算错误的基类
FloatingPointError

浮点计算错误
OverflowError

数值运算超出最大限制
ZeroDivisionError

除(或取模)零 (所有数据类型)
AssertionError

断言语句失败
AttributeError

对象没有这个属性
EOFError

没有内建输入,到达EOF 标记
EnvironmentError

操作系统错误的基类
IOError

输入/输出操作失败
OSError

操作系统错误
WindowsError

系统调用失败
ImportError

导入模块/对象失败
LookupError

无效数据查询的基类
IndexError

序列中没有此索引(index)
KeyError

映射中没有这个键
MemoryError

内存溢出错误(对于Python 解释器不是致命的)
NameError

未声明/初始化对象 (没有属性)
UnboundLocalError

访问未初始化的本地变量
ReferenceError

弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError

一般的运行时错误
NotImplementedError

尚未实现的方法
SyntaxError

语法错误
IndentationError

缩进错误
TabError

Tab 和空格混用
SystemError

一般的解释器系统错误
TypeError

对类型无效的操作
ValueError

传入无效的参数
UnicodeError

Unicode 相关的错误
UnicodeDecodeError

Unicode 解码时的错误
UnicodeEncodeError

Unicode 编码时错误
UnicodeTranslateError

Unicode 转换时错误
Warning

警告的基类
DeprecationWarning

关于被弃用的特征的警告
FutureWarning

关于构造将来语义会有改变的警告
OverflowWarning

旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning

关于特性将会被废弃的警告
RuntimeWarning

可疑的运行时行为(runtime behavior)的警告
SyntaxWarning

可疑的语法的警告
UserWarning

用户代码生成的警告
 

 

11.6 总结

这一章我们已经讨论了try..except和try..finally 语句的用法,同时也学习了如何创建我们自己的异常类型以及如何引发异常。接下来,我们将探索Python 标准库。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: