Python异常处理:try-except-finally详解
·
使用背景
部分代码执行可能存在不可预知的错误,例如以下代码:
- 改造前:
def main(a,b):
c= a+b
return c
if __name__ == '__main__':
main(1,'a')
执行报错:TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’
避免影响其他代码执行,需要考虑对异常的捕获和处理 确保后续代码正常执行。
- 改造后:
def main(a,b):
try:
c= a+b
return c
except TypeError:
print( 'please input int')
except:
print('other error')
if __name__ == '__main__':
main(1,'a')
将原本要执行但可能出现异常的代码放到 try 下面。若程序出现异常则进入 except 区块。
except 后跟特定的异常类型,如 TypeError等;
若只有 except 后面不带类型 则处理其他所有异常。
try...except...finally 的基本结构
try...except...finally 是 Python 中用于异常处理的语法结构,用于捕获和处理代码运行时可能出现的错误,同时确保某些操作(如资源清理)无论如何都会执行。
try:
# 尝试执行的代码块
risky_operation()
except SomeException as e:
# 捕获特定异常并处理
handle_exception(e)
finally:
# 无论是否发生异常都会执行的代码
cleanup_resources()
各部分的作用
try 块
包含可能引发异常的代码。如果其中某行代码抛出异常,后续代码将不会执行,直接跳转到对应的 except 块。
except 块
捕获并处理特定的异常。可以指定异常类型(如 ValueError、IOError),或使用通用的 Exception 捕获所有异常。支持多个 except 块处理不同类型的异常。
except ValueError:
print("输入值错误")
except ZeroDivisionError:
print("除数不能为零")
except Exception as e:
print(f"未知错误: {e}")
finally 块
无论是否发生异常,finally 中的代码都会执行。通常用于释放资源(如关闭文件、数据库连接)。即使 try 或 except 中有 return 或未处理的异常,finally 仍会执行。
常见使用场景
- 文件操作
确保文件无论是否出错都会被关闭:
file = None
try:
file = open("example.txt", "r")
data = file.read()
except IOError:
print("文件读写错误")
finally:
if file:
file.close()
- 数据库连接
释放数据库连接资源:
import sqlite3
conn = None
try:
conn = sqlite3.connect("database.db")
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
except sqlite3.Error as e:
print(f"数据库错误: {e}")
finally:
if conn:
conn.close()
- 自定义异常处理
捕获特定业务逻辑异常:
class InsufficientFundsError(Exception):
pass
try:
withdraw_money(amount)
except InsufficientFundsError:
print("余额不足")
finally:
update_transaction_log()
注意事项
- 异常层级:
except块应按照从具体到通用的顺序排列,避免通用异常(如Exception)掩盖特定异常。 - 避免空
except:空的except会捕获所有异常(包括KeyboardInterrupt),可能隐藏问题。建议明确指定异常类型。 finally中的返回值:若finally和try中均有return,finally的返回值会覆盖try的返回值。
与其他语句结合
else块:当try未发生异常时执行,通常用于放置无异常时的逻辑:
try:
result = calculate()
except CalculationError:
print("计算失败")
else:
print(f"结果为: {result}")
finally:
reset_calculator()
更多推荐


所有评论(0)