python第十二课 高级(错误与异常)
语法错误与异常的区别
语法错误(Syntax Error):代码在编写阶段因不符合语言规范而无法被解释器解析执行。这类错误必须通过修正代码本身解决,无法通过异常处理机制捕获。例如变量名拼写错误、缩进错误、缺少冒号等。
异常(Exception):代码语法正确,但在运行时因逻辑或环境问题触发的错误。可通过异常处理机制(如try-except)捕获并处理。常见异常类型包括:
常见运行时异常类型
ZeroDivisionError
数学运算中除数为零时触发:
res = num1 / num2 # num2为0时触发
AttributeError
访问对象不存在的属性时触发:
print(p1.address) # Person类无address属性
IndexError
访问序列(列表/元组等)时索引越界:
print(li[3]) # 列表只有3个元素
KeyError
访问字典中不存在的键:
print(dict['adderse']) # 键名拼写错误
ValueError
类型转换或函数参数值无效:
int('hello') # 字符串无法转为整数
NameError
访问未定义的变量:
print(name) # 变量未声明
KeyboardInterrupt
用户手动中断程序(如Ctrl+C):
a = input() # 执行时手动终止
异常处理建议
- 使用
try-except块捕获特定异常类型 - 优先处理具体的异常类而非通用
Exception - 结合
else和finally实现完整处理逻辑 - 通过日志记录异常信息辅助调试### 异常处理核心要点
防止程序崩溃
异常处理的核心目标是避免程序因未捕获的异常直接终止,确保后续代码能继续执行。通过捕获异常并处理,程序可实现优雅降级而非强制中断。
基础语法结构
try:
# 可能引发异常的代码
except 异常类型:
# 异常处理逻辑
else:
# 无异常时执行
finally:
# 必定执行的清理代码
异常捕获类型
- 精准捕获:指定具体异常类型(如
ValueError、ZeroDivisionError) - 通用捕获:使用
Exception捕获所有普通异常 - 多异常合并:通过元组同时捕获多种异常
except (TypeError, IndexError) as e:
异常对象信息
通过 as e 获取异常实例,可访问:
str(e):异常描述信息type(e):异常类型e.args:异常参数元组
完整执行流程
- try:尝试执行高风险代码
- except:仅当匹配异常发生时触发
- else:未发生异常时执行(必须位于所有 except 之后)
- finally:无论是否异常都会执行(常用于资源释放)
主动抛出异常
使用 raise 手动触发异常,通常用于参数校验或自定义错误场景:
if not isinstance(x, int):
raise ValueError("必须输入整数")
继承关系注意
- 捕获异常时需按从子类到父类顺序排列
BaseException是顶级父类,Exception是其子类
关键区别
try/except:处理已存在的异常raise:主动创建异常finally与else互斥执行但不会冲突
记忆口诀:try试错,except抓错,else没错走,finally必走### 代码功能分析
这段Python代码实现了一个年龄判断功能,根据用户输入的年龄输出对应的成年状态。
代码结构解析
print('年龄判断')
try:
age = int(input("请输入你的年龄:"))
if 18 <= age <= 120:
print('你成年了')
elif 0 <= age < 18:
print('未成年')
else:
raise ValueError("年龄应该为0-120")
except Exception as e:
print(f'代码出现问题{e}')
关键点说明
-
输入处理
使用input()获取用户输入,并通过int()转换为整数类型。 -
逻辑判断
- 18-120岁判定为成年
- 0-17岁判定为未成年
- 其他数值抛出异常
- 异常处理
try-except捕获可能的异常- 使用
raise主动抛出异常处理无效输入
改进建议
- 输入提示可更明确:“请输入0-120之间的年龄”
- 异常处理可细化,区分
ValueError和TypeError - 边界值处理更严谨,如
age<0的情况
执行流程
- 程序启动显示"年龄判断"
- 等待用户输入数字
- 根据输入值输出相应状态
- 处理可能出现的异常情况
注意事项
raise用于主动抛出异常try-except用于捕获和处理异常- 两者配合使用可实现更健壮的异常处理机制### 自定义异常类的实现要点
定义异常类
创建一个以Error结尾的类,继承Exception或其子类。通过super().__init__()将异常信息传递给父类处理:
class SchoolNameError(Exception):
def __init__(self, msg):
super().__init__(msg)
业务逻辑校验
在函数中触发自定义异常,通常结合条件判断。当不满足业务规则时,使用raise抛出异常实例:
def check_name(name):
if len(name) >= 10:
raise SchoolNameError('学校名字过长')
else:
print('名字合规')
异常处理机制
通过try/except捕获自定义异常,实现优雅的错误处理:
try:
check_name('过长的学校名称')
except SchoolNameError as e:
print(f'捕获异常:{e}')
关键注意事项
- 父类
Exception已内置消息存储机制,子类无需单独定义属性 - 自定义异常类名需清晰表达错误类型,推荐后缀使用
Error raise会中断当前流程,需与条件判断配合使用- 可通过继承体系创建不同层级的异常类(如
ValueError子类)
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)