前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[编程经验] Python异常处理小结

[编程经验] Python异常处理小结

作者头像
用户1622570
发布2018-04-11 15:54:54
1.2K0
发布2018-04-11 15:54:54
举报
文章被收录于专栏:机器学习和数学

想分享的东西很多,但是不知道怎么规划,只能想起一个写一个了。今天分享一下我对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 用户代码生成的警告

本文为作者原创,如有雷同,必然是别人抄我的。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-05-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习和数学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档