异常处理

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 标准库。

Python基础概念_10_异常处理相关推荐

  1. 原python基础概念整理_Python从头学之基础概念整理

    学程序真的是一个无法间断的过程,只要你懈怠,种种原因都是你的理由.然而造成的后果就是到目前位置,一个心目中的项目都没有完美的做出来: 归根结底,其实就是基础没有打好,因为每一个复杂的功能都是由很多简单 ...

  2. Python基础概念_14_常见术语

    常见术语 15 常见术语 15.1 简介 Python里有一些常见的专业名词.用语,我们一般统称为术语.为了更方便的学习python我们通过表格的方式列举了常用的术语和单词以及工具. 15.2 常见术 ...

  3. Python基础概念_8_字符串处理

    字符串处理 9 字符串处理 9.1 简介 在前面的章节里我们介绍了常用的数据类型,其中字符串并没有单独拎出来讲,那么接下来我们将重点讲下它.字符串一般是通过引号('或")包裹起来的,因为它有 ...

  4. Python基础概念_2_基础概念

    基础概念 3 基础概念 3.1 数字 计算机最初设计时就是为了做数据运算的,所以针对这个概念应该不会陌生.在Python的世界里数主要有三种类型: 整数.浮点数和复数,详见下例: a) 5 是一个整数 ...

  5. python核心理念_《三天搞定Python基础概念之第一天》中文版

    前言: 首先,非常感谢Jiang老师将其分享出来!本课件非常经典! 经过笔者亲测,竟然确实只要三天,便可管中窥豹洞见Python及主要库的应用.实属难得诚意之作! 其次,只是鉴于Jiang老师提供的原 ...

  6. learnpythonthehardway中文版_《三天搞定Python基础概念之第一天》中文版

    前言: 首先,非常感谢Jiang老师将其分享出来!本课件非常经典! 经过笔者亲测,竟然确实只要三天,便可管中窥豹洞见Python及主要库的应用.实属难得诚意之作! 其次,只是鉴于Jiang老师提供的原 ...

  7. Python基础概念_5_函数

    函数 6 函数 6.1 简介 函数是被定义的完成指定功能的可被反复使用的代码段.比如我们想实现一个功能,想知道当前的时间,格式是:年-月-日 时:分:秒.我们就可以这么写: import time d ...

  8. 第4章 基础知识进阶 第4.1节 Python基础概念之迭代、可迭代对象、迭代器

    第四章 基础知识进阶 第十七节 迭代.可迭代对象.迭代器 一.    引言 本来计划讲完元组和字典后就讲列表解析和字典解析,但要理解列表解析和字典解析,就需要掌握Python的高级的类型迭代器,因此本 ...

  9. Python基础概念_11_标准库

    标准库 12 标准库 12.1 简介 Python 标准库是随Python附带安装的,它包含大量极其有用的模块.熟悉 Python 标准库是十分重要的,因为如果你熟悉这些库中的模块,那么你的大多数问题 ...

最新文章

  1. 别再盲目学 Python 了!
  2. matlab 线性拟合相关系数,Matlab自动选择相关性最高波段并拟合曲线
  3. NLB网路负载均衡管理器详解
  4. c语言期末作业自己设计个小程序,帮看一个小程序吧,c语言期末考…求求各位大神了...
  5. boost采取什么驱动电路_当我们只是采取积极的意愿时会发生什么?
  6. Python入门级2
  7. HDU - 5493 Queue 2015 ACM/ICPC Asia Regional Hefei Online(线段树)
  8. 系统出错, 发生系统错误 1067, 进程意外终止. 解决方法
  9. java怎么把程序写入持久化_如何将DataFrame持久化到Hive表?
  10. DEVC++中的 “万能头文件” <bits/stdc++.h>
  11. 用图片替代cursor光标样式
  12. GPS NMEA协议,0183 定位数据格式 双模定位:GNXXX GPS+BD 完整版
  13. 中国注塑机市场十四五规划建议与竞争态势研究报告2022版
  14. 方剂学(综合练习)题库【1】
  15. 解决Chrome浏览器无法加载flash插件的问题
  16. Minimax AI 算法在井字游戏(或 Noughts and Crosses)游戏中的实现
  17. 最新版-----新浪微博的第三方登录
  18. Java中synchronization和Lock对比
  19. 微信小程序-仿朋友圈点赞评论操作面板
  20. masonry ajax瀑布流,jquery.masonry瀑布流插件的4个使用步骤

热门文章

  1. OpenCASCADE:使用DRAW绘图
  2. wxWidgets:wxHTML 概述
  3. boost::intrusive::value_traits用法的测试程序
  4. boost::intrusive::auto_unlink_hook用法的测试程序
  5. boost::core模块实现范围枚举C++11
  6. VTK:可视化算法之PlateVibration
  7. VTK:Utilities之FileOutputWindow
  8. VTK:PolyData之TransformPipeline
  9. OpenGL 行星asteroids系统的实例
  10. C++实现插值查找(附完整源码)