想分享的东西很多,但是不知道怎么规划,只能想起一个写一个了。今天分享一下我对Python异常的理解,希望能对大家有所启发。
首先需要知道什么是异常?“异”就是不同,有区别,不太一样等的意思,“常”就是正常,平常,所以“异常”可以理解为和正常情况有所区别的东西!那么和编程语言联系起来就是和预期有区别的输出。简单说异常也可以理解为“bug”,只不过是这个“bug”可以通过程序猿运行程序之前定义好,然后如果发生了异常,那么可以比较合理的打印出异常的信息。
其实今天为啥要讲异常呢!因为今天我遇到了让我很无语的问题!跑了半个月的程序,也有了结果,而且结果也还不错,But,这个程序就是 有问题 问题 题!!!因为在读取输入数据的时候没有做随机处理,导致输入的数据一直没变,所以虽然最后结果还可以,但是这可能是过拟合的结果!且不说模型没保存,就有了想屎的心,如果最后得到了一堆废柴!哎,除了教训,只能是无语!好了,回归Python异常!
首先理解了什么是异常,异常表现为一种有可能发生的情况。注意既然是有可能发生,那就也有可能不发生。举个简单的栗子,比如我们登录某个网站的时候,需要输入用户名和密码,对吧,如果用户名或者密码输错了,一般会提示“用户名或密码错误,请重新输入”,有时候还会有一句“忘记密码?”。这两句话就是当发生异常是输出的提示信息,而能输出这样的信息的前提是,系统判断出了你输入的用户名或者密码是错误的。在Python中,“系统判断”的这个行为被称为异常捕获(好像猎人捕获了猎物…)。输出的信息就是捕获异常之后输出的用来指出发生了什么样的错误。下面把Python中捕获异常的六种方法总结一下。
1. Try...except...语句
下面写个简单的栗子,了解一下try…except…语句的使用方法(图1)。对于try…except…语句来说,首先会执行try后面的程序,然后执行except语句,如果在try后面发生了异常,且是except语句中可以捕获的错误类型,那么讲会按照except中的提示信心输出异常信息,否则会输出Python中其他异常(图2)。当我们输入“机器学习和数学”的时候,下面输出的错误是TypeError,也叫做类型错误,因为我么程序中定义了两个数的除法,而“机器学习和数学”是一个字符串类型的数据,所以会发生类型错误的异常信息。
图1
图2
这里我想说一下,新手在看错误信息的时候,刚开始会很不习惯,一看到输出了一大堆红色的东西,头就大了。这时候不能心急,要慢慢仔细看一下输出的信息都写了什么,然后检查一下代码,如果能看出来错误就ok了,如果看不出来,先百度一下,最后实在不行再问别人,不要动不动就张口问别人,遇到问题要先自己想办法解决。
比如这里的第一个错误信息,Traceback(most recent call last):,“Traceback”的意思是回溯,“most recent call last”可以理解为在“File"C:/Python27/Scripts/exception_test.py", line 5, in <module>”,刚刚就是在第5行发生了异常。说到这里我还行在提一下,“<module>”,这个是什么意思?这个问题留给各位看官啦,下次会解释。
2. try....except... except...else语句
很明显,刚才try...except...语句,没有将所有的错误类型都包括,所以需要对它进行改进(图3)。然后我们Ctrl+F5运行程序,得到图4。try....except...except...else语句的执行过程为,先执行try后面的程序,然后依次执行except后面的,最后如果没有发生except里面指出的异常类型,才会执行else后面的程序!这里需要说明的是,except语句的数量理论上是没有限制的,你可以写任意多个except。因为有时候需要判断的异常情况确实很多而且不能合并为一种情况,就需要写多个except。
图3
图4
3. try...finally...语句
我们先把except语句注释掉(Python中单行注释使用#),然后看一下图7,当发生异常的时候,finally语句也执行了,这个是和else有区别的地方。然后我们打开注释(图6),Ctrl+F5执行程序,我们发现无论是否发生异常,最后都打印出了“已完成计算”。这就说明finally语句无论如何都会执行的。
图5
图6
图7
4. try....except...else...finally...语句
直接看图8,左边是代码,右边是输出。try....except...else...finally...语句的执行过程为先执行try,然后判断异常类型,如果没发生异常执行else,最后执行finally,如果发生异常,执行完try之后执行except对应的异常类型,最后还会执行finally。这就明白了吧。
图8
5. raise语句
有时候我们可以主动的把异常表达出来,Python中叫做抛出异常。语法格式为:
raise [SomeException [, args [,traceback]]
首先是raise,然后SomeException就是异常的类型,args是SomeException的一个参数,且必须要有这个参数。Traceback一般用不到。下面看几个栗子。需要运行那一句程序,把注释打开即可!图9里面把Python中常见的错误都列举到了,可以重点关注一下!!!
# coding:utf-8
#raise NameError ("这是一个名称错误 !")
#raise IndexError ("这是一个索引错误 !")
raise TypeError ("这是一个类型错误 !")
#raise ZeroDivisionError ("这是一个除0错误 !")
#raise SyntaxError ("这是一个语法错误 !")
#raise KeyError ("这是一个关键字错误 !")
#raise IOError ("这是一个输入输出错误 !")
#raise AttributeError ("这是一个方法错误,尝试访问未定义的对象属性 !")
#raise ValueError ("这是一个传入值错误 !")
图9(图片看不清,还是直接贴代码吧)
图10
两个特殊的处理异常的简便方法
1. assert语句
第一个叫做断言语句,就是说我先声称有这样一个错误,如果确实有那就抛出异常,如果没有则直接跳过,继续执行其他的程序。assert语句的语法格式为:
assert expression[,reason]
其中assert是断言的关键字。执行过程为,先判断表达式expression,如果表达式为真,则什么都不做;如果表达式不为真,则抛出异常。 图11中写了2个简单的栗子,当assert后面的表达式为True是,没有输出断言的信息,当为False的时候,输出了信息。
图11
2. with语句
With语句是一种比较特殊的异常处理的方法。取了一个比较优雅的名字叫“上下文管理器”,在Python中有个叫做“上下文管理协议”的机制。而with语句呢只有在支持“上下文管理协议”的对象中才可以使用“上下文管理器”with语句。举个形象点的栗子,只有加入联合国的国家,才会去遵守某一个联合国的规定。而Python中那些对象是支持“上下文管理协议”的呢?这个留给感兴趣的童鞋自己去阅读(提示:官方文档有)。下面举个简单的栗子(图12),来说明with语句的执行过程。
图12
首先with后面的open函数打开文件名为test.txt文件,打开方式为只读模型‘r’。as f的意思是将文件对象赋给f。这里可以打印一下f的类型print type(f),输出为file类型。然后是一个循环,将文件中的每一行都打印出来。这里无论是否出现异常,对于支持Python“上下文管理协议”的文件对象来说,Python最后会为关闭这个文件。为什么需要关闭文件?因为我们这个文件之后两行汉字,而如果文件特别大,打开之后未关闭,有可能就会造成内存不足而卡死!
讲到这里Python中的异常全部写完了,内容是比较多的,一下可能理解不了,那就先收藏以后看吧! 在Python中,异常的种类有很多种,但是都是以一个叫BaseException的类做为基类。基类是面向对象中的一个术语,如果不明白可以先不管,可以理解为最基本的一个异常类型。最后把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 弱引用(Weakreference)试图访问已经垃圾回收了的对象
RuntimeError 一般的运行时错误
NotImplementedError 尚未实现的方法
SyntaxError Python 语法错误
IndentationError 缩进错误
TabError Tab 和空格混用
SystemError 一般的解释器系统错误
TypeError 对类型无效的操作
ValueError 传入无效的参数
UnicodeError Unicode 相关的错误
UnicodeDecodeError Unicode 解码时的错误
UnicodeEncodeError Unicode 编码时错误
UnicodeTranslateError Unicode 转换时错误
Warning 警告的基类
DeprecationWarning 关于被弃用的特征的警告
FutureWarning 关于构造将来语义会有改变的警告
OverflowWarning 旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning 关于特性将会被废弃的警告
RuntimeWarning 可疑的运行时行为(runtimebehavior)的警告
SyntaxWarning 可疑的语法的警告
UserWarning 用户代码生成的警告
本文为作者原创,如有雷同,必然是别人抄我的。