目录
前言
在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块成功执行后运行。八、实际案例展示了文件操作、网络请求等场景的异常处理,如案例一处理文件不存在错误,案例二处理网络超时,案例三实现自定义异常验证输入。合理使用异常处理能使程序更稳定可靠,建议遵循"具体异常优先捕获"原则,配合日志记录完善错误处理机制。