异常是指程序中的例外、违例情况,比如序列的下标越界、打开不存在的文件、空引用异常等。通过捕获异常并进行正确处理,可以提高程序的健壮性。如果没有代码处理异常,Python解释器将输出相关异常信息并终止程序。
Python中处理异常是通过try/except/else/finally语句完成。它们的语法结构下:
try: Normal execution block except A: Exception A handle except B: Exception B handle except: Other exception handle else: if no exception,get here finally: print("finally")
说明:
1、try子句中的代码防止可能出现异常的语句。
2、except子句为捕获异常时进行处理的逻辑。except A、except B中的语句表示捕获到异常为A、异常类型为B时针对性处理的逻辑。except表示除去异常类型A、B之外所有其他类型。
3、else子句在try子句中代码执行未发生异常情况下执行。else语句为可选语句。
4、finally子句无论try子句中是否发生异常都会被执行。常用于关闭因异常而不能释放的系统资源。finally子句为可选语句。
5、注意上述try/except A/except B/except/else/finally语句的先后顺序,不能随意调换顺序。
下面通过打开文件的案例来了解一下实现方法。
try: print "try block" fp = open('ip.txt', 'r') except: print "except block" print "%s file,please check." % ('ip.txt') sys.exit(1) else: print "else block" ip_lst = fp.readlines() fp.close() finally: print "finally block"
上述try语句在ip.txt存在和不存在两种情况下执行的结果如下图所示:
通过执行结果对比可以知道,在ip.txt文件存在情况下,执行了try/else/finally中的代码。而在ip.txt不存在情况下,执行try/except/finally中的代码。也就论证了上述说明中的第3/4点描述。案例中代码虽然针对异常进行处理,但是并没有显示关闭被打开的文件资源。修改后的代码如下:
try: print "try block" fp = open('ip.txt', 'r') except: print "except block" print "%s file,please check." % ('ip.txt') sys.exit(1) else: print "else block" ip_lst = fp.readlines() fp.close() finally: print "finally block" fp.close()
在ip.txt文件不存在情况下执行代码,程序异常中断,提示“NameError: name 'fp' is not defined”。原因是因为try语句中定义的变量的作用域导致的。变量fp只在try语句中有效,属于局部变量。因此,为了使变量fp具有全局性。可以使用try/except语句嵌套的方式完成。修改后的代码如下:
try: fp = open('ip.txt', 'r') try: ip_lst = fp.readlines() except: print "read %s fail" % ('ip.txt') sys.exit() finally: print "call internal finall close file" fp.close() except: print "%s file,please check." % ('ip.txt') sys.exit(1)
最后,通过上述案例描述可以了解try/except/else/finally的基本用法。合理的捕获异常并进行异常处理可以有效提高代码的健壮性。