专栏首页玄魂工作室Python黑帽编程2.7 异常处理

Python黑帽编程2.7 异常处理

异常是个很宽泛的概念,如果程序没有按预想的执行,都可以说是异常了。遇到一些特殊情况没处理会引发异常,比如读文件的时候文件不存在,网络连接超时。程序本身的错误也可以算作异常,比如把字符串当整数来处理,拼写错误。

不论是系统还是框架,都会对基本异常进行分类,比如IO异常,内存溢出等等。很多时候,针对特有的业务,我们也可以自定异常。

下面我们先看一个引发异常的例子:

Print 'hello'

这个例子很简单,我们将print的首字母大写。这会引发一个错误:

图2

我们可以观察到有一个SyntaxError被引发,并且检测到的错误位置也被打印了出来。捕获错误,打印错误信息,这本身就是一种异常处理。那么我们如何在代码中处理异常呢?

2.7.1 TRY ….EXCEPT

例如我们用如下代码去打开文件:

open('abc.txt','r')

但是要打开的文件并不存在,这个时候程序就会抛出异常,如下图所示:

图3

我们看到抛出的错误为 IOError,那么我们可以使用如下的代码来处理这个异常。

try:

open('abc.txt','r')

except IOError,msg:

print msg

运行结果如下:

图4

我们把所有可能引发错误的语句放在try块中,然后在except从句中处理所有的错误和异常。except从句可以专门处理单一的错误或异常,或者一组包括在圆括号内的错误/异常。如果没有给出错误或异常的名称,它会处理 所有的 错误和异常。对于每个try从句,至少都有一个相关联的except从句。

例如:

try:

open('abc.txt','r')

except IOError,msg:

print msg

except:

print 'other erro'

如果某个错误或异常没有被处理,默认的Python处理器就会被调用。它会终止程序的运行,并且打印一个消息,我们已经看到了这样的处理。

2.7.2 抛出异常

我们可以使用raise语句 引发 异常。你还得指明错误/异常的名称和伴随异常 触发的 异常对象。我们可以引发的错误或异常应该分别是一个Error或Exception类的直接或间接导出类。

我们先看示例代码:

#!/usr/bin/python

class ShortInputException(Exception):

'''A user-defined exception class.'''

def __init__(self, length, atleast):

Exception.__init__(self)

self.length = length

self.atleast = atleast

try:

s = raw_input('Enter something --> ')

if len(s) < 3:

raise ShortInputException(len(s), 3)

# Other work can continue as usual here

except EOFError:

print '\nWhy did you do an EOF on me?'

except ShortInputException, x:

print 'ShortInputException: The input was of length %d, \

was expecting at least %d' % (x.length, x.atleast)

else:

print 'No exception was raised.'

这段代码中我们首先自定义了一个ShortInputException类,它继承自Exception类,构造函数接受两个参数输入字符串的长度和最小长度。接下来代码中,我们获取用户输入,判断长度是否小于3,如果小于3触发ShortInputException。我们从终端启动这个脚本,运行结果如下:

图5

2.7.3 TRY..FINALLY

当我们需要不管是否有异常,都要执行某段代码的时候,就需要finally出场了。看下面的示例:

def test1():

try:

print('to do stuff')

raise Exception('hehe')

print('to return in try')

return 'try'

except Exception:

print('process except')

print('to return in except')

return 'except'

finally:

print('to return in finally')

return 'finally'

test1Return = test1()

print('test1Return : ' + test1Return)

在 try 中 raise一个异常,就立刻转入 except 中执行,在except 中遇到 return 时,就强制转到 finally 中执行, 在 finally 中遇到 return 时就返回。运行结果如下:

图6

2.7.9 小结

本节我们学习了Python中基本的异常处理,和自定义异常的方法。

本文分享自微信公众号 - 玄魂工作室(xuanhun521),作者:玄魂工作室-玄魂

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-08-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 渗透测试入门指南与路线规划(全文版)

    我本非安全大牛,水平有限,所以自然亲民,和许多渗透测试的初学者打得火热。这其中大部分是大学生,还有工作多年,但一直对网络安全热情不减的热血之人。许多同学一直在努...

    用户1631416
  • Fluxion 实战答疑

    0x00-设置更新源 在apt-get install xxx前要记得更新源哦,在用官网源更新,需要代理,关于如何设置代理,在玄魂工作室微信订阅号(xuanhu...

    用户1631416
  • 中国互联网黑市分析:信封号产业链

    2013年中旬,美国一家互联网公司进入中国,在产品落地和市场竞争分析时找到TOMsInsight团队做顾问。这家公司的优势是技术和产品设计,但国内有两家无节操的...

    用户1631416
  • python基础教程:错误处理和异常处理

    在前面介绍Python语法的过程中,我们已经接触到了解释器给的错误和异常,但并没有详细讲解它们。现在我们就全面的来学习Python是对语法错误等错误进行定义和处...

    一墨编程学习
  • python常见报错信息!错误和异常!附带处理方法

    作为 Python 初学者,在刚学习 Python 编程时,经常会看到一些报错信息。

    小小科
  • python3--面向对象内置方法例子,python异常处理

    [Card(ranks='7', suits='红心'), Card(ranks='9', suits='方板'), Card(ranks='K', suits...

    py3study
  • 透过文学经典理解软件设计的抽象思想

    博尔赫斯(Jorge Luis Borges)有一篇奇文,曰《博闻强记的富内斯》,以纪实手法杜撰了一个具有非凡记忆能力的传奇人物富内斯。博尔赫斯自云:“(《博闻...

    张逸
  • 视觉信息理论

    我喜欢有一个新的思维方式来思考这个世界。我特别喜欢把一些模糊的想法正式化为一个具体的概念。信息理论就是一个很好的例子。

    Hi胡瀚
  • Python 文件复制&按目录树结构拷贝&批量删除目录及其子目录下的文件

    #!/usr/bin/env/ python # -*- coding:utf-8 -*- __author__ = 'shouke' im...

    授客
  • 《无问西东》豆瓣短评分析

    《无问西东》讲述了四代人清华人,在矛盾与期待中不断找寻自我、砥砺前行的故事。上映后得到了广泛的关注,也引发了强烈的讨论。本文首先通过爬虫技术,从豆瓣上获得相关短...

    三猫

扫码关注云+社区

领取腾讯云代金券