在项目开发中,异常处理是不可或缺的。异常处理帮助人们debug,通过更加丰富的信息,让人们更容易找到bug的所在。异常处理还可以提高程序的容错性。
>>> 1/0
Traceback (most recent call last):
File "", line 1, in
1/0
ZeroDivisionError: division by zero
上例中输入一除以零触发ZeroDivisionError异常。下面我们来捕捉这个异常
strFormula=input("请输入公式")
while(True):
if strFormula=="exit":
print("计算结束")
break
try:
print("%s=%.2f" %(strFormula,eval(strFormula)))
except ZeroDivisionError:
print("除数不能为零")
except:
print("公式输入有误!")
strFormula=input("请输入公式")
如果try中有异常发生时,将执行异常的归属,执行except。异常层层比较,看是否是exception1, exception2...,直到找到其归属,执行相应的except中的语句。如果except后面没有任何参数,那么表示所有的exception都交给这段程序处理。
如果无法将异常交给合适的对象,异常将继续向上层抛出,直到被捕捉或者造成主程序报错。比如下面的程序
def test_func():
try:
m = 1/0
except NameError:
print("Catch NameError in the sub-function")
try:
test_func()
except ZeroDivisionError:
print("Catch error in the main program")
子程序的try...except...结构无法处理相应的除以0的错误,所以错误被抛给上层的主程序。
try:
s = None
if s is None: #is检查两个对象是否是同一个对象
print ("s 是空对象")
raise Error1 #如果引发Error1异常,后面的代码将不能执行
print (len(s))
except TypeError:
print ("空对象没有长度")
class MyInputException(Exception):
def __init__(self, length, least):
Exception.__init__(self)
self.length = length
self.least = least
try:
s = input('输入一个字符串:')
# 如果长度小于5,触发自定义的异常
if len(s) < 5:
raise MyInputException(len(s), 5)
except EOFError:
print ('触发了EOF错误,按了Ctrl+d')
except MyInputException as x: #2.6版本之后要使用as
print ('输入的字符串只有%d,至少需要%d个字符' % (x.length, x.least))
except Exception:
print ('不知道什么错误!' )
finally:
print ('有没有异常都会执行这里!')
file_object = open('thefile.txt')
try:
all_the_text = file_object.read( )
finally: #文件读写将.close()放在finally中是个好习惯
file_object.close( )
在python中,is检查两个对象是否是同一个对象,而==检查他们是否相等.
p = [1]
q = [1]
p is q # False 因为他们不是同一个对象
p == q # True 因为他们的值相等
所以如果你要比较两个值是否相同就用==,如果比较是否是同一个对象就用is.
下一讲: Python菜鸟学习手册12----循环对象