Python异常处理
2.4.1 基础概念
1 什么是异常
异常(Exception)是程序运行时发生的错误或异常情况。当Python程序遇到无法正常处理的情况时,会抛出异常。如果不处理这些异常,程序会崩溃并显示错误信息。
2 异常的类型
Python中的异常分为两大类:
- 内置异常:Python预定义的异常类型
- 自定义异常:用户自己定义的异常类型
Python中常见的异常类型:
SyntaxError:语法错误NameError:未定义变量TypeError:类型错误ValueError:值错误FileNotFoundError:文件未找到ZeroDivisionError:除零错误
3 异常处理关键字详解
try
- 作用:标记可能发生异常的代码块
- 含义:尝试执行这段代码,如果出现异常则跳转到except块处理
- 特点:必须与except、finally或else配合使用
except
- 作用:捕获并处理try块中抛出的异常
- 语法:
except [异常类型] [as 变量名]: - 含义:当try块中发生指定类型的异常时,执行except块中的代码
- 示例:
except ValueError: # 只捕获ValueError except Exception as e: # 捕获所有异常,e是异常对象
else
- 作用:当try块中没有异常发生时执行的代码
- 含义:只有在try块成功执行(无异常)时才运行
- 特点:必须放在except之后,finally之前
finally
- 作用:无论是否发生异常都会执行的代码
- 含义:通常用于清理资源(关闭文件、数据库连接等)
- 特点:即使try或except中有return语句,finally也会执行
raise
- 作用:主动抛出异常
- 含义:用于在代码中手动触发异常
- 示例:
raise ValueError("输入值无效") raise # 重新抛出当前异常
with
- 作用:上下文管理器,自动处理资源的获取和释放
- 含义:确保资源在使用完毕后被正确释放
- 示例:
with open("file.txt") as f: # 自动关闭文件 data = f.read()
as
- 作用:将异常对象赋值给变量
- 含义:用于在except块中获取异常的详细信息
- 示例:
except Exception as e: print(f"错误信息: {e}")
2.4.2 异常处理语法
基本语法
try:
# 可能出错的代码
result = 10 / 0
except ZeroDivisionError:
print("除数不能为零")
处理多种异常
try:
number = int(input("请输入数字: "))
result = 10 / number
except ValueError:
print("输入无效")
except ZeroDivisionError:
print("除数不能为零")
except Exception as e:
print(f"其他错误: {e}")
完整语法
try:
file = open("data.txt", "r")
data = file.read()
except FileNotFoundError:
print("文件未找到")
else:
print("读取成功")
finally:
if 'file' in locals():
file.close()
2.4.3 最佳实践
使用with语句
# 自动处理文件关闭
with open("data.txt", "r") as file:
data = file.read()
自定义异常
class ValidationError(Exception):
def __init__(self, message):
self.message = message
super().__init__(message)
def validate_age(age):
if age < 0:
raise ValidationError("年龄不能为负数")
return True
2.4.4 实际应用
数据库操作
import sqlite3
def get_user(user_id):
try:
conn = sqlite3.connect('users.db')
cursor = conn.cursor()
cursor.execute("SELECT * FROM users WHERE id = ?", (user_id,))
return cursor.fetchone()
except sqlite3.OperationalError as e:
print(f"数据库错误: {e}")
return None
finally:
if 'conn' in locals():
conn.close()
网络请求
import requests
def fetch_data(url):
try:
response = requests.get(url, timeout=10)
response.raise_for_status()
return response.json()
except requests.exceptions.Timeout:
print("请求超时")
except requests.exceptions.ConnectionError:
print("连接错误")
except Exception as e:
print(f"未知错误: {e}")
return None
文件处理
import json
def read_json(file_path):
try:
with open(file_path, 'r', encoding='utf-8') as file:
return json.load(file)
except FileNotFoundError:
print("文件不存在")
except json.JSONDecodeError:
print("JSON格式错误")
except Exception as e:
print(f"读取错误: {e}")
return None
2.4.5 关键要点
- 使用具体异常类型而不是通用Exception
- 合理使用try-except-else-finally结构
- 使用with语句自动管理资源
- 记录异常信息便于调试
- 避免过度使用异常处理,考虑性能影响
评论区