异常处理——菜鸟的Python笔记

点击打开原帖地址

为什么使用异常

错误处理、事件通知、特殊情况处理、退出时的行为、不正常的程序流程。

简单的示例

在没有任何定义x变量的时候:

print x
print 1

将会抛出NameError异常:

NameError: name 'x' is not defined

而且1并不会被输出,也就是说程序将被中断。如果讲代码修改如下:

try:
print x
except NameError:
print "Something is wrong!"
print 1

得到的输出将是:

Something is wrong!
1

可见,我们定义的except会“抓住”NameError类型的语句,并且执行相应的处理代码,而且程序不会被中断。

使用raise

我们可以自己触发异常,例如:

raise IndexError

Python会返回:

Traceback (most recent call last):
File "d:\我的文档\桌面\todo\exep.py", line 1, in <module>
raise IndexError
IndexError

自定义的异常

下面定义了一个MyException类,它继承自Python内置的Exception类。

class MyException(Exception):pass
try:
#some code here
raise MyException
except MyException:
print "MyException encoutered"

结果为:

MyException encoutered

可以在一个except内捕获多个异常:

except (AttributeError, TypeError, SyntaxError):
  

捕获所有异常

只要在except后面不加任何异常类型,这个except块就可以捕获所有的异常。

except:

捕获异常的继承关系

当我们except Super的时候,同样会捕获到raise Sub的异常。

finally

无论try块是否抛出异常,永远执行的代码。通常用来执行关闭文件,断开服务器连接的功能等等。

class MyException(Exception):pass
try:
#some code here
raise MyException
except MyException:
print "MyException encoutered"
finally:
print "Arrive finally"

结果:

MyException encoutered
Arrive finally

try、except、else

可以在try块里加入else块,代码块将在没有异常被抛出的时候执行:

try:
print "normal code here"
except MyException:
print "MyException encoutered"
else:
print "No exception"

finally:
print "Arrive finally"

结果为:

normal code here
No exception
Arrive finally

raise异常、同时添加数据

raise异常的同时,我们可以添加一些额外的数据,就像下面的例子一样:

class MyException(Exception):pass
try:
raise MyException,", and some additional data"
except MyException,data:
print "MyException encoutered"
print data

断言assert

断言是指期望指定的条件满足,如果不满足则抛出AssertionError异常。例如:

def positive(x):
assert x > 0
print "x"
positive(1)
positive(0)

positive(0)一句将会抛出一个异常。

with/as

with/as语句主要是为了代替try/finally语句、通常用来做一些善后工作或者是清理现场的工作。

with open('test.txt') as myfile:
for line in myfile:
#code here
#code here

当with代码块结束之后,文件将会自动关闭。这是因为返回的对象支持context management protocol。原书598页有关于该协议的讨论,例如如何自定义一个支持该协议、从而支持with语句的类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值