自定义异常类
定义自己的异常类型,让错误信息更清晰。
自定义异常类 是 CoddyKit 上的免费 Python Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Python Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Python Academy 课程共包含 4 节课。
介绍
自定义异常类可以让错误处理更加明确、易于理解,也方便调用方进行精确处理。
为什么要使用自定义异常
内置异常过于笼统。自定义异常可以让调用方只捕获 YOUR 库的错误,而不会捕获无关错误。
class AppError(Exception):
pass
raise AppError('something went wrong')继承 Exception
class MyError(Exception): pass 就足够了。请始终继承 Exception,而不是 BaseException。
class ValidationError(Exception):
pass
try:
raise ValidationError('email is invalid')
except ValidationError as e:
print(e)添加自定义属性
class APIError(Exception): def __init__(self, status, message): self.status = status; super().__init__(message)
class APIError(Exception):
def __init__(self, status, message):
self.status = status
super().__init__(message)
try:
raise APIError(404, 'Not found')
except APIError as e:
print(e.status, e)异常层次结构
构建层次结构:class DBError(AppError): pass——调用方可以捕获 AppError 来处理任何应用错误,也可以专门捕获 DBError。
class AppError(Exception): pass
class DBError(AppError): pass
class NetworkError(AppError): pass
try:
raise DBError('timeout')
except AppError as e:
print('app error:', e)自定义 __str__ 方法
重写 __str__ 可以控制打印异常消息时的显示方式。
class RangeError(ValueError):
def __init__(self, val, lo, hi):
self.val, self.lo, self.hi = val, lo, hi
def __str__(self):
return f'{self.val} not in [{self.lo}, {self.hi}]'
print(RangeError(15, 0, 10))引发自定义异常
在函数中使用 raise 发出领域特定错误的信号。这样可以为调用方提供整洁的接口。
class InsufficientFundsError(Exception):
def __init__(self, needed, available):
super().__init__(f'Need {needed}, have {available}')
def withdraw(balance, amount):
if amount > balance:
raise InsufficientFundsError(amount, balance)
return balance - amount
try:
withdraw(100, 200)
except InsufficientFundsError as e:
print(e)按基类捕获
except AppError 会捕获所有子类,例如 DBError、NetworkError 等。层次结构让调用方可以选择处理的具体程度。
class AppError(Exception): pass
class DBError(AppError): pass
try:
raise DBError('conn failed')
except AppError:
print('any app error')带有上下文管理器的异常
自定义异常可以与上下文管理器集成:class suppressed: __exit__ 返回 True 来抑制异常。
class SuppressValue(Exception): pass
try:
raise SuppressValue('ignored')
except SuppressValue:
pass # suppress silently
print('continued')记录自定义异常
请记录 WHEN 应该引发异常,以及 WHAT 属性代表的含义。良好的文档字符串可以让自定义异常更易于使用。
class ConfigError(Exception):
"""Raised when configuration is invalid.
Attributes:
key: The invalid config key
"""
def __init__(self, key, msg):
super().__init__(msg)
self.key = key最佳实践
保持层次结构浅(2 到 3 层)。请始终继承 Exception。使用以 Error 结尾且含义明确的名称。将异常放在专用的 exceptions.py 模块中。
# Good structure:
class AppError(Exception): pass
class ValidationError(AppError): pass
class NotFoundError(AppError): pass
print('hierarchy demo')快速检查
为了避免捕获会退出系统的事件,自定义异常应该继承自什么?
回顾
自定义异常:继承 Exception,在 __init__ 中添加属性,并重写 __str__。构建层次结构以便捕获。将异常放在 exceptions.py 模块中。
继续学习
做得很好!请继续下一课,持续进步。
常见问题解答
「自定义异常类」课时是免费的吗?
是的 — 「自定义异常类」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Python Academy 课程的其余内容,请升级到 CoddyKit PRO。 Python Academy 课程共包含 4 节课。
「自定义异常类」这节课中我会学到什么?
定义自己的异常类型,让错误信息更清晰。 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Python Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Python Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「自定义异常类」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Python Academy 课中编写并运行代码吗?
能。每节 Python Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。