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

Python黑帽编程2.7 异常处理

作者头像
用户1631416
发布2018-04-12 11:31:46
7200
发布2018-04-12 11:31:46
举报
文章被收录于专栏:玄魂工作室玄魂工作室
异常是个很宽泛的概念,如果程序没有按预想的执行,都可以说是异常了。遇到一些特殊情况没处理会引发异常,比如读文件的时候文件不存在,网络连接超时。程序本身的错误也可以算作异常,比如把字符串当整数来处理,拼写错误。

不论是系统还是框架,都会对基本异常进行分类,比如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中基本的异常处理,和自定义异常的方法。

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

本文分享自 玄魂工作室 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2.7.1 TRY ….EXCEPT
  • 2.7.2 抛出异常
  • 2.7.3 TRY..FINALLY
  • 2.7.9 小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档