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

python异常处理

作者头像
互联网老辛
发布2018-10-18 17:32:54
7010
发布2018-10-18 17:32:54
举报
文章被收录于专栏:互联网老辛互联网老辛

什么是异常

异常处理是工作中编写代码必须要完成的内容,对于不符合预期的用户操作或数据输入,程序总会出现异常情况,而对异常情况能够妥善处理,是保证程序稳定性的关键工作之一。

异常出现的原因非常多,逻辑错误,用户输入错误都会造成异常。

举个例子,告诉我们什么是异常:

代码语言:javascript
复制
filename = input("Enter file path:")
代码语言:javascript
复制
f = open(filename)
代码语言:javascript
复制
print(f.read())

这个简单的程序中我们会用到后续章节中将详细介绍的文件操作,open()函数打开文件,read()函数读取文件内容。

首先 input()函数会读取用户的输入作为文件的路径,如果用户输入的文件不存在会怎么样呢?

会出现文件不存在的异常,并且会发现 Traceback,这就是系统抛出的异常,异常的类型是 FileNotFoundError。

Python 常用的异常类有很多,我们不需要去记住,只需要在收到异常的时候能通过查询文档了解含义。这里介绍几个最常见的异常类:

  • NameError 访问一个未定义的变量
  • SyntaxError 语法错误,这个严格讲算是程序的错误
  • IndeError 对于一个序列,访问的索引超过了序列的范围(序列的概念会在后续实验中讲到),可以理解为我的序列里只有三个元素,但要访问第4个
  • KeyError 访问一个不存在的字典 Key,字典也会在下一节实验中详细讲到,Key 如果不存在字典就会抛出这个异常
  • ValueError 传入无效的参数
  • AttributeError 访问类对象中不存在的属性

异常处理

如果出现了异常,我们不可以直接将异常抛给用户,应该使用 Python 提供的异常处理方法来捕获并处理异常,处理方法为使用 try,except 和finally 三个关键字。

其中我们把可能出现异常的代码放到 try 代码块,然后在 except代码块中添加处理异常的方法,回到刚才的文件读取类,我们将 open 和 read 放到 try 代码块中,except中处理。

代码格式如下:

代码语言:javascript
复制
try:
代码语言:javascript
复制
    有可能抛出异常的代码
代码语言:javascript
复制
except异常类型名称:
代码语言:javascript
复制
    处理代码
代码语言:javascript
复制
except异常类型名称:
代码语言:javascript
复制
    处理代码

这里需要注意的是 except 可以有多个,每个处理不同类型的异常,也可以不写任何异常类型名称,则会处理所有捕获的异常。

改进的文件读取程序为:(创建一个文件来执行)

代码语言:javascript
复制
filename = input("Enter file path:")
代码语言:javascript
复制
try:
代码语言:javascript
复制
    f = open(filename)
代码语言:javascript
复制
    print(f.read())
代码语言:javascript
复制
    f.close()
代码语言:javascript
复制
except FileNotFoundError:
代码语言:javascript
复制
    print("File not found")

当 try 代码块中一旦出现异常,这个代码块后续的代码不会继续执行,会直接进入到 except 异常处理代码块中。

我们把这个程序写到 /home/shiyanlou/fileexc.py中,然后执行,并输入上面例子中的不存在的文件,这个时候会被 except 捕获并处理。

finally 关键字是用来进行清理工作,经常和 except 一起使用,即无论是正常还是异常,这段代码都会执行。

如果一个文件处理的程序中异常出现在 f.write()向文件中写入数据的时候,就无法执行 close 操作,使用 finally可以保证无论 try 代码块中的代码是否抛出异常,都能够执行 finally 代码块里的内容,保证文件被正常关闭。

修改上述的程序如下,改为写入操作,引入 finally 保证文件可以被正常关闭:

代码语言:javascript
复制
filename = '/etc/protocols'
代码语言:javascript
复制
f = open(filename)
代码语言:javascript
复制
try:
代码语言:javascript
复制
    f.write('xinsz08')
代码语言:javascript
复制
except:
代码语言:javascript
复制
    print("File write error")
代码语言:javascript
复制
finally:
代码语言:javascript
复制
    print("finally")
代码语言:javascript
复制
    f.close()

程序运行的结果:

代码语言:javascript
复制
File write error
代码语言:javascript
复制
finally

表示虽然异常,但仍然执行到了 finally 代码块。

这里需要说明下抛出异常的原因是以只读的模式打开了一个文件,但尝试向文件中写入内容,所以会抛出异常。另外 except:这个语句后不写任何参数,表示将处理所有 try 代码块中抛出的异常。

抛出异常

如果我们希望在程序中抛出一些异常的时候如何操作呢,可以使用 raise 语句。

代码语言:javascript
复制
raise异常名称

例如,我们在代码里希望抛出一个 ValueError,直接使用:

代码语言:javascript
复制
raise ValueError()

外部的代码就可以使用 except ValueError进行捕获和处理了。

回顾最常用以下内容:

  1. Python 开发环境
  2. 变量与数据类型
  3. 输入与输出
  4. 运算
  5. 字符串
  6. 控制结构
  7. 异常处理

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

本文分享自 大数据架构师专家 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是异常
  • 异常处理
  • 抛出异常
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档