一、为什么使用异常处理

  当程序运行的时候出现了异常,导致程序终止运行,为了解决这种情况,我们需要预先对可能出现的异常进行处理,一旦出现这种异常,就使用另一种方式解决问题,还有就是错误信息是使用者没有必要看到的,他们不需要知道内部错误的原因,所以我们需要友好的显示错误信息,这就需要用到异常处理。

二、简单异常处理

  在以下代码里,首先获取用户输入的值,然后到try代码块里,在try代码块里的代码是收到保护的,如果try中的代码发生了异常,就会执行except中的代码。

  在try中的代码,如果某一句出现了错误,则这一句下面的代码就不再执行,直接执行except中的代码。

inp = input('请输入内容:')
try:
num = int(inp)
print(num)
except Exception as e:
print(e)
print('数据类型转换失败!') 输出结果:
请输入内容:aaa
invalid literal for int() with base 10: 'aaa'
数据类型转换失败!

三、异常处理分类

  在上面的示例中,except后面的Exception是一个包含有错误信息的类,而这个e是创建的Exception的对象,包含着错误信息,比如下面的输出结果。

li = []
inp = input('请输入内容:')
li[int(inp)] 输出结果:
请输入内容:aaa
Traceback (most recent call last):
File "C:/Users/Administrator/PycharmProjects/untitled1/Alexsel/gg.py", line 318, in <module>
li[int(inp)]
ValueError: invalid literal for int() with base 10: 'aaa'

这里的ValueError就是异常的一种,接下来我们就了解一下Python中的常见的异常。

异常 描述
NameError 尝试访问一个没有声明的变量
ZeroDivisionError 除数为0
SyntaxError 语法错误
IndexError 索引超出序列范围
KeyError 请求一个不存在的字典关键字
IOError 输入输出错误(比如要读的文件不存在)
AttrilbuteError 尝试访问未知的对象属性
ValueError 传给函数的参数类型不正确,比如给int()函数传入字符串
ImportError 无法引入模块或包,大部分是路径或者名称错误
IndentationError 语法错误,比如代码没有正确对齐
KeyboardInterrupt Ctrl+C正被按下
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量, 导致你以为正在访问它

四、异常的分类处理

  一个程序运行的时候可能出现多种异常,常见的异常我们在上面都展示给大家了,每种异常都可以根据类型捕捉到,比如出现了ValueError类型的错误,我们可以使用ValueError进行捕捉,其它类型的异常就无法捕捉到,我们可以针对出现的那些异常进行分类处理,以便更好的处理异常。

li = []
inp = input('请输入内容:')
try:
li[int(inp)]
except IndexError as ie:
print('索引错误')
except ValueError as ve:
print('参数类型不正确') 输出结果:
请输入内容:aaa
参数类型不正确

如果我们不想那么麻烦,想直接捕捉所有类型的异常怎么办,那么我们就使用Exception。

li = []
inp = input('请输入内容:')
try:
li[int(inp)]
except Exception as e:
print(e) 输出结果:
请输入内容:aaa
invalid literal for int() with base 10: 'aaa'

如果想同时使用Exception和单个类型异常捕捉,应该吧单个类型异常的捕捉放到Exception的后面,因为Exception放在前面则直接使用这个捕捉所有的错误,下面的异常处理不再执行。

之前我们说到Exception是一个类,我们刚才有讲了单个异常处理,例如ValueError,NmaeError等,这些异常都是Exception的派生类。

五、完整的异常处理结构

try:
pass
except ValueError as e:
#当try中发生ValueError异常的时候,执行这里的代码
pass
except Exception as e:
pass
else:
#try中没有出现异常执行这里的代码
pass
finally:
#最终,无论什么情况,最后都执行这里的代码
pass

执行流程

  如果try中的代码出现错误,首先判断是不是ValueError错误,如果是执行,不是执行Exception中的错误处理代码,最终执行finally中的代码。

  如果try中的代码没有出现错误,就行else中的代码,最终执行finally中的代码。

六、主动触发异常

  之前我们出现的错误都是解释器触发的,我们想要自己触发一个异常需要怎么做,这里我么就要使用到raise。

try:
print('alexsel')
raise Exception('出错了!!!')#这里就是创建了一个Exception对象,下面的e就是这个对象
except Exception as e:
print(e) 输出结果:
alexsel
出错了!!!

这里的自己触发的错误以及自定义的错误信息,就直接传递到相应错误类型创建的对象中,在这里就传递到了e中,这个e就是封装了错误信息的一个对象。

这里我们就针对这个对象,再讲一个类中的特殊成员__str__。

我们之前说到Exception是一个类,我们刚才使用类Exception('出错了!!')创建了一个对象,然后这个对象就传递给了e,最后我们可以使用print将e的里包含的内容输出,可是我们在对一般的对象输出时就不会输出信息,只会出现该对象内存信息,如下

class Foo:
def __init__(self):
print('init') obj = Foo()
print(obj) 输出结果:
init
<__main__.Foo object at 0x00000000027F1898>

但是我们在使用异常处理的时候,创建的e也是一个对象,为什么可以使用print打印出错误信息,原因就是在错误处理的类中写了一个特殊的类成员__str__,使用这个之后,创建的使用print打印创建的对象就会输出__str__中返回值返回的内容。

class Foo:
def __init__(self,age):
self.age = age def __str__(self):
return self.age obj = Foo('')
print(obj) 输出结果:
99

这里创建对象的时候传入了age,在我们输出的时候,输出了__str__中的返回值,所以输出了99。

七、自定义异常处理代码

我们在刚才知道了raise的用法和为什么可以使用print打印出错误信息,我们就可以使用这两个方法进行自定义异常处理代码,我们就简单做一个例子。

class MyException(Exception):
def __init__(self,message):
self.message = message def __str__(self):
return self.message try:
print('alexsel')
raise MyException('我的异常处理!')
except MyException as e:
print(e) 输出结果:
alexsel
我的异常处理!

在这里需要注意一下,我们自己写的异常处理的类需要继承Exception,只有这样我们才能成功在raise和except后面使用的时候成功调用。

Python学习:18.Python异常处理的更多相关文章

  1. Python学习-18.Python中的错误处理(三)

    在某些情况下,我们需要定义自己的异常并且抛出 先定义一个错误: class MyError(BaseException): def __init__(self): pass 上面定义了一个叫MyErr ...

  2. 《转》Python学习(18)-python函数(二)

    转自 http://www.cnblogs.com/BeginMan/p/3173328.html 一.装饰器(decorators) 装饰器的语法以@开头,接着是装饰器函数的名字.可选参数. 紧跟装 ...

  3. Python学习day09 - Python进阶(3)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  4. Python学习day05 - Python基础(3) 格式化输出和基本运算符

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  5. Python学习笔记之异常处理

    1.概念 Python 使用异常对象来表示异常状态,并在遇到错误时引发异常.异常对象未被捕获时,程序将终止并显示一条错误信息 >>> 1/0 # Traceback (most re ...

  6. Python学习笔记—Python基础1 介绍、发展史、安装、基本语法

    第一周学习笔记: 一.Python介绍      1.Python的创始人为吉多·范罗苏姆.1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...

  7. Python学习day07 - Python进阶(1) 内置方法

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  8. python学习笔记-python程序运行

    小白初学python,写下自己的一些想法.大神请忽略. 安装python编辑器,并配置环境(见http://www.cnblogs.com/lynn-li/p/5885001.html中 python ...

  9. Python学习(一) Python安装配置

    我本身是Java程序猿,听说Python很强大,所以准备学习一下Python,虽说语言都是相同的,但java跟python肯定还是有区别的.希望在此记录一下自己的学习过程. 目前,Python分2.X ...

  10. python学习: 优秀Python学习资源收集汇总--转

    Python是一种面向对象.直译式计算机程序设计语言.它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用縮进来定义语句块.与Scheme.Ruby.Perl ...

随机推荐

  1. Spring学习---Spring中利用jackson进行JSON转换

    Spring中利用jackson进行JSON转换 import java.util.List; import com.fasterxml.jackson.core.JsonProcessingExce ...

  2. Mysql常用函数汇总-经典实用

    以下是对mysql中的常用函数进行了汇总介绍.需要的朋友可以过来参考下. 一.数学函数ABS(x) 返回x的绝对值BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制)CEILING(x ...

  3. memcached的操作

    memcached是一个高性能的分布式内存对象缓存系统,用于动态web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库次数,从而提高动态.数据库驱动网站的速度.memcached基于 ...

  4. yum安装工具的理解

    在安装gtk+编译环境的过程中,你会发现,RPM软件包之间的依赖关系非常复杂.在实际管理过程中,这种依赖关系可能会更加复杂.因此非常有必要寻找一种自动化安装工具,让安装工具自己处理这些关系复杂的依赖关 ...

  5. Appfuse搭建过程(下源代码不须要maven,lib直接就在项目里(否则痛苦死!))

    什么是Appfuse:AppFuse是一个集成了众多当前最流行开源框架与工具(包含Hibernate.ibatis.Struts.Spring.DBUnit.Maven.Log4J.Struts Me ...

  6. UVa 1639 - Candy(数学期望 + 精度处理)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  7. xss实现获取内网ip

    前提得浏览器支持webRTC,测试的时候google浏览器测试成功,火狐浏览器不支持webRTC, 再在xss平台直接复制如下js代码: function form_ip(ip,port){ var ...

  8. jmeter接口测试3-正则表达式提取器的使用

    正则表达式的用处很多,最基础的用法 1,断言 2,传参(关联) 例子 1.http请求 2正则表达式提取,想要提取列表列中id,一遍打开列表页 如果是1,每次就会取相同的值!匹配数字的权限高于模板$0 ...

  9. App测试需要测什么

    App,做为当下最热的手机安装软件,无论是产品本身的设计还是性能,易用性等都是非常受考验.一个app能在用户的手机上使用,并作为一个长期用户是非常不容易的.那么,App的测试中我们到底要测试什么呢? ...

  10. 修改ubuntu计算机名

    修改计算机名下: -$sudo gedit /etc/hostname -$sudo gedit /etc/hosts