在项目开发中,异常处理是不可或缺的。异常处理帮助人们debug,通过更加丰富的信息,让人们更容易找到bug的所在。异常处理还可以提高程序的容错性。
>>> 1/0 Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> 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.
下一讲:
原文地址:http://blog.csdn.net/a359680405/article/details/42403659