Python异常处理机制

目录

前言

一、异常概念

二、常见的错误类型

三、语法格式

四、基础用法

五、捕获多个异常

六、万能except

七、else子句

1.循环中的else子句

1.1.for-else结构

1.2.while-else结构

2.异常处理中的else子句

try-except-else结构

八、案例分析

案例一

案例二

案例三

总结



前言

在python中,当程序在执行过程中突然产生错误或异常,会结束运行,这样会给用户带来不好的体验感。为了解决这一问题,我们经常会在开发的过程中添加异常处理,通过使用try语句处理可能产生的异常。

一、异常概念

异常(Exception) 是一个 对象 ,它把程序运行过程中遇到的错误信息打包。当解释器检测到错误时,会 抛出(raise) 一个异常对象;如果没人处理,它就一直往上层调用栈冒泡,直到最顶层,然后打印 traceback 并终止程序。

异常处理(Exception Handling) 是一种机制,用于捕获并处理程序运行时可能出现的错误,防止程序崩溃,并允许开发者优雅地处理错误情况。

二、常见的错误类型

  • ValueError 传入无效参数

  • TypeError 类型不对

  • KeyError 字典键不存在

  • IndexError 序列索引越界

  • AttributeError 对象没有该属性

  • OSError 操作系统级错误(文件、网络等)

  • RuntimeError 通用运行时错误

三、语法格式

python 复制代码
try:
    可能出错的代码
except Exception1 as e1:
    处理异常1
except (Exception2, Exception3) as e23:
    处理异常2或3
else:
    没发生异常时执行(可选)
finally:
    无论有没有异常都会执行(可选,常用于清理资源)

参数解释:

  • try:可能出错的代码。
  • except:出错以后处理异常
  • else:只有 没有异常 时才执行,适合放「依赖 try 成功后的逻辑」。
  • finally:无论是否有没有异常都会执行,常用于关闭文件、释放锁、断开网络连接等。

四、基础用法

异常处理比较基础的用法是最小可运行示例:try / except。

python 复制代码
def div(a, b):
    return a / b

try:
    print(div(10, 0))
except ZeroDivisionError as e:
    print("除 0 错误:", e) # 除 0 错误: division by zero

五、捕获多个异常

在代码中可能一段小的程序出现多种异常,这样我们则可以使用多异常捕获来进行。

python 复制代码
try:
    num = int("abc")
    result = 10 / num
except (ValueError, ZeroDivisionError) as e:
    print(f"出错啦:{e}")

或者我们可以这样写:

python 复制代码
try:
    a = int(input("输入第一个数字:"))
    b = int(input("输入第二个数字:"))
    if b == 1:
       # raise ZeroDivisionError("除数出现0异常")
       raise ValueError("值异常")
       print(a / b)
except ZeroDivisionError as e:
    print("除数不为0", e)
except ValueError as e:
    print("输入的值不合法或者输入的不是数字", e)

# 最宽泛的异常,可以捕获各种异常,写在最后面。
except Exception as e:
    print(f"触发异常, 异常信息{e}")

六、万能except

当在不确定会出现哪种类型的异常时,我们可以使用except,无需指明具体的异常类型。

python 复制代码
try:
    num1 = int(input('请输入整数:'))
    num2 = int(input('请输入整数:'))
    print("num1/num2=", num1 / num2)
except Exception as e:  
    print('出现异常:', e) # 输出产生的异常类型

七、else子句

1.循环中的else子句

当在循环中查找某元素时,如果找到则break,否则在else中处理未找到的情况。

1.1.for-else结构

python 复制代码
for item in iterable:
    # 循环体
    if condition:
        break
else:
    # 当循环正常完成(没有遇到break语句)时执行
    print("循环完成,未遇到break")

1.2.while-else结构

python 复制代码
while condition:
    # 循环体
    if other_condition:
        break
else:
    # 当while条件变为False且未遇到break时执行
    print("循环正常结束")

2.异常处理中的else子句

将可能引发异常的代码放在try块中,将依赖于try块成功执行的代码放在else块中,这样可以使异常处理更加清晰,避免捕获非预期的异常。

try-except-else结构

python 复制代码
try:
    # 尝试执行的代码
    result = risky_operation()
except SomeException:
    # 异常处理
    print("发生异常")
else:
    # 当try块中没有引发异常时执行
    print("操作成功完成")
    # 可以在这里处理result
finally:
    # 无论是否发生异常都会执行
    print("清理工作")

八、案例分析

案例一

python 复制代码
try:
    num = int(input("请输入一个整数: "))
    result = 100 / num
except ValueError:
    print("输入的不是有效整数!")
except ZeroDivisionError:
    print("不能除以零!")
else:
    print(f"计算结果: {result}")
finally:
    print("程序执行完毕")

案例二

python 复制代码
try:
    with open("data.txt", "r") as file:
        content = file.read()
        print(content)
except FileNotFoundError:
    print("文件不存在!")
except PermissionError:
    print("没有文件访问权限!")
except IOError as e:
    print(f"文件操作出错: {e}")
else:
    print("文件读取成功")

案例三

python 复制代码
import sqlite3

try:
    conn = sqlite3.connect("example.db")
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM users WHERE id=?", (user_id,))
    user = cursor.fetchone()
except sqlite3.OperationalError as e:
    print(f"数据库操作错误: {e}")
except sqlite3.DatabaseError as e:
    print(f"数据库错误: {e}")
else:
    if user:
        print(f"找到用户: {user}")
    else:
        print("用户不存在")
finally:
    conn.close()

总结

Python异常处理是程序健壮性的重要保障。一、异常是程序运行时发生的错误事件,会中断正常流程。二、常见错误类型包括SyntaxError(语法错误)、IndexError(索引越界)、TypeError(类型错误)等。三、基本语法格式为try-except-finally结构,try块放置可能出错的代码,except捕获异常,finally确保资源释放。四、基础用法是通过特定异常类捕获处理错误。五、捕获多个异常可用元组包含多个异常类,或写多个except子句。六、万能except Exception能捕获所有异常,但应谨慎使用。七、else子句有两种用法:1.循环中的else在未触发break时执行,包括1.1 for-else和1.2 while-else结构;2.异常处理中的else在try块成功执行后运行。八、实际案例展示了文件操作、网络请求等场景的异常处理,如案例一处理文件不存在错误,案例二处理网络超时,案例三实现自定义异常验证输入。合理使用异常处理能使程序更稳定可靠,建议遵循"具体异常优先捕获"原则,配合日志记录完善错误处理机制。