一、核心基础:异常是什么、有什么用
1. 异常是什么
异常是Python程序运行时出现的错误(如除零、索引越界),会中断程序执行,本质是程序运行时的“意外情况”,并非语法错误(语法错误是编写时的问题,无法运行)。
2. 异常有什么用
|
核心作用 |
具体说明(零基础易懂) |
|
1. 避免程序崩溃 |
捕获异常后,程序不会因意外错误中断,可继续执行后续代码(比如用户输入错误,程序不闪退)。 |
|
2. 定位问题根源 |
异常会提示错误类型和位置,无需逐行排查,快速定位问题(如TypeError、IndexError,一眼知道错误原因)。 |
|
3. 提升程序健壮性 |
处理异常后,程序可应对各种意外情况(如输入非数字、文件不存在),更符合实际使用场景。 |
3.无异常处理 vs 有异常处理
# 1. 无异常处理:程序崩溃
a = 10
b = 0
print(a / b) # 除零错误,程序中断,后续代码不执行
print("程序继续运行")
# 2. 有异常处理:程序正常执行
a = 10
b = 0
try:
print(a / b)
except ZeroDivisionError:
print("错误:除数不能为0")
print("程序继续运行")
二、深入核心:异常处理的核心用法
1. 异常处理四大关键字
| try | 包裹可能发生异常的代码 | try { 可能出错的代码 } | 必须与 catch 或 finally 搭配使用 | 数据库操作、IO操作、网络请求等 | 不能单独存在,后面必须跟 catch 或 finally |
| catch | 捕获并处理异常 | catch (Exception e) { 处理代码 } | 可选(但通常需要) | 对异常进行日志记录、提示用户、恢复程序 | 可以有多个,子类异常要写在前面 |
| finally | 无论是否发生异常都会执行 | finally { 必执行代码 } | 可选 | 释放资源(关闭流、数据库连接等) | 即使有 return 也会执行(特殊情况除外,如 JVM 退出) |
| throw | 手动抛出异常对象 | throw new Exception("错误信息"); | 可选 | 自定义业务异常、参数校验失败 | 抛出的是“异常对象” |
2. 核心用法代码演示
# 场景1:捕获单个异常
try:
lst = [1, 2, 3]
print(lst[5]) # 索引越界
except IndexError:
print("错误:索引超出范围")
# 场景2:捕获多个异常(常用)
try:
a = int(input("请输入数字:"))
print(10 / a)
except (ValueError, ZeroDivisionError):
print("错误:输入无效或除数为0")
# 场景3:try-except-else-finally 完整用法
try:
f = open("test.txt", "r")
content = f.read()
except FileNotFoundError:
print("错误:文件不存在")
else:
print("文件内容:", content)
finally:
f.close() # 无论是否出错,都关闭文件
print("文件已关闭")
三、常用异常类型
|
异常类型 |
触发场景 |
|
ZeroDivisionError |
除数为0(如10 / 0) |
|
IndexError |
索引超出容器范围(如lst[5],lst长度为3) |
|
ValueError |
数据类型正确但值无效(如int("abc")) |
|
TypeError |
数据类型错误(如10 + "abc") |
|
FileNotFoundError |
打开不存在的文件(如open("test.txt", "r")) |
四、深入拓展:主动抛出异常与自定义异常
1. 主动抛出异常(raise关键字)
# 主动抛出指定异常
def check_age(age):
if age < 0 or age > 120:
raise ValueError("年龄必须在0-120之间")
print(f"年龄:{age}")
check_age(150) # 主动抛出异常,中断程序
# 结合try-except捕获
try:
check_age(150)
except ValueError as e:
print(e) # 打印异常信息
2. 自定义异常(继承Exception类)
# 自定义异常类
class MyError(Exception):
pass
# 使用自定义异常
try:
score = int(input("请输入成绩:"))
if score < 0 or score > 100:
raise MyError("成绩必须在0-100之间")
except MyError as e:
print(e)
else:
print(f"成绩:{score}")
五、注意点
-
except 后不指定异常类型,会捕获所有异常(不推荐,无法精准定位问题)。
-
多个except时,子类异常(如ZeroDivisionError)要放在父类异常(如Exception)前面,否则子类异常不会被捕获。
-
finally 内的代码无论是否有异常都会执行,常用于释放资源(如关闭文件、数据库连接)。
-
异常处理不是越多越好,只捕获可能出现的异常,避免过度捕获(冗余)。
网硕互联帮助中心





评论前必须登录!
注册