使用背景

部分代码执行可能存在不可预知的错误,例如以下代码:

  • 改造前:
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
捕获并处理特定的异常。可以指定异常类型(如 ValueErrorIOError),或使用通用的 Exception 捕获所有异常。支持多个 except 块处理不同类型的异常。

except ValueError:
    print("输入值错误")
except ZeroDivisionError:
    print("除数不能为零")
except Exception as e:
    print(f"未知错误: {e}")

finally
无论是否发生异常,finally 中的代码都会执行。通常用于释放资源(如关闭文件、数据库连接)。即使 tryexcept 中有 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 中的返回值:若 finallytry 中均有 returnfinally 的返回值会覆盖 try 的返回值。

与其他语句结合

  • else:当 try 未发生异常时执行,通常用于放置无异常时的逻辑:
try:
    result = calculate()
except CalculationError:
    print("计算失败")
else:
    print(f"结果为: {result}")
finally:
    reset_calculator()

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐