python异常之try/finally分句

1 python异常之try/finally分句

不管try语句代码块是否发生异常,finally分句代码块都会执行。

finally分句用于定义任何情况下都必须执行的清理操作,将会在最后执行。

finally分句用于任何需要保证资源释放的场景。

比如,文件操作后的关闭文件,连接数据库后的断开数据库。

1.1 基本用法

try复合语句必须有一个except分句或finally分句,并且编写顺序如下:

try->except->else->finally

用法

格式一

try: 
    语句代码块 
except [type [as value]]: 
    语句代码块 
[except [type [as value]]: 
    语句代码块]* 
[else: 
    语句代码块] 
[finally: 
    语句代码块] 

格式二

try: 
    语句代码块 
finally: 
    语句代码块 

描述

格式一中,使用else分句前必须有except分句。

不管try是否发生异常,是否被处理finally都会执行,包括如下情况:

(1) try语句代码块发生异常并被处理;

(2) try语句代码块发生异常并没处理;

(3) try语句代码块未发生异常;

(4) except或else处理器中发生或未发生新的异常;

示例

>>> def testfinally(s,i):
    try:
        print(s[i])
    except IndexError as ie:
        print('索引错误:',ie)
    else:
        print('执行else'+s[i])
    finally:
        print('执行finally')
    print('执行与try复合语句有相同缩进的代码块')

# (1)   try语句代码块发生异常并被处理;   
>>> testfinally('梯阅线条',5)
索引错误: string index out of range
执行finally
执行与try复合语句有相同缩进的代码块
# (2)   try语句代码块发生异常并没处理;
>>> testfinally(9555,5)
执行finally
Traceback (most recent call last):
  File "", line 1, in <module>
    testfinally(9555,5)
  File "", line 3, in testfinally
    print(s[i])
TypeError: 'int' object is not subscriptable
# (3)   try语句代码块未发生异常
>>> testfinally('梯阅线条',1)
阅
执行else阅
执行finally
执行与try复合语句有相同缩进的代码块
# (4)   except或else处理器中发生或未发生新的异常;
>>> testfinally([1,2,3],1)
2
执行finally
Traceback (most recent call last):
  File "", line 1, in <module>
    testfinally([1,2,3],1)
  File "", line 7, in testfinally
    print('执行else'+s[i])
TypeError: can only concatenate str (not "int") to str

1.2 finally使用举例

1.2.1 关闭文件

描述

对文件操作后,不管失败成功,最后都要关闭文件,在finally分句编写对应代码。

示例

>>> def testfinally(filepath):
    try:
        f=open(filepath)
    except FileNotFoundError as fnfe:
        print('打开文件失败:',fnfe)
    except Exception as e:
        print(e)
    else:
        content=f.read()
        print(content)
    finally:
        print('执行finally')
        f.close()

        
>>> testfinally(r'E:\documents\F盘\hello.txt')
hello!python!
执行finally

1.2.2 关闭数据库

描述

对数据库操作后,不管失败成功,最后都要关闭连接,在finally分句编写对应代码。

示例

>>> def testfinally():
    import pymysql
    conn = None
    try:
        conn = pymysql.connect(host="localhost", user="user", password="password", database="test")
        cur = conn.cursor()
    except pymysql.MySQLError as mse:
        print("连接数据库失败:", mse)
    except Exception as e:
        print("连接数据库失败:", e)
    else:
        cur.execute("SELECT * FROM users")
        rows = cur.fetchall()
        for row in rows:
            print(row)
    finally:
        print('执行finally')
        if conn:
            conn.close()
>>> testfinally()
连接数据库失败: (2003, "Can't connect to MySQL server on 'localhost' ([WinError 10061] 由于目标计算机积极拒绝,无法连接。)")
执行finally

你可能感兴趣的:(python,python)