异常是指程序中的例外、违例情况,比如序列的下标越界、打开不存在的文件、空引用异常等。通过捕获异常并进行正确处理,可以提高程序的健壮性。如果没有代码处理异常,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存在和不存在两种情况下执行的结果如下图所示:

python3异常值处理 python怎么处理异常值_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的基本用法。合理的捕获异常并进行异常处理可以有效提高代码的健壮性。