python - 创建合作的例外
问题描述
Python文档状态:
程序可以通过创建新的异常类来命名自己的异常(有关 Python 类的更多信息,请参见类)。异常通常应该直接或间接地从 Exception 类派生。
...
在创建一个可能引发多个不同错误的模块时,一种常见的做法是为该模块定义的异常创建一个基类,并为其创建子类以针对不同的错误条件创建特定的异常类。
每个级别都会剥离它需要的关键字参数,以便可以将最终的空字典发送到根本不需要参数的方法(例如,object.init需要零参数)
假设我有以下StudentValueError
和MissingStudentValue
例外。
class StudentValueError(Exception):
"""Base class exceptions for Student Values"""
def __init__(self, message, **kwargs):
super().__init__(**kwargs)
self.message = message # You must provide at least an error message.
class MissingStudentValue(StudentValueError):
def __init__(self, expression, message, **kwargs):
super().__init__(message, **kwargs)
self.expression = expression
def __str__(self):
return "Message: {0} Parameters: {1}".format(self.message, self.expression)
我想创建合作的例外。我有两个问题:
- 在这种情况下,
Exception
类构造函数需要零参数(空dict
),对吗? - 我的例子是否违反了 LSP?
此处提供的已接受答案继承自ValueError
.
解决方案
Exception
不接受关键字参数,它只接受可变数量的位置参数 via *args
,因此您需要更改**kwargs
为*args
. 我也建议通过message
并expression
与呼叫*args
一起。super()
毕竟,这个例子可能不违反 LSP:
class StudentValueError(Exception):
"""Base class exceptions for Student Values"""
def __init__(self, message='', *args):
super().__init__(message, *args)
self.message = message
class MissingStudentValue(StudentValueError):
def __init__(self, message='', expression='', *args):
super().__init__(message, expression, *args)
self.expression = expression
def __str__(self):
return "Message: {0} Parameters: {1}".format(self.message, self.expression)
e = Exception('message', 'expression', 'yet_another_argument')
print(e)
e = StudentValueError('message', 'expression', 'yet_another_argument')
print(e)
e = MissingStudentValue('message', 'expression', 'yet_another_argument')
print(e)
e = MissingStudentValue()
print(e)
推荐阅读
- database - 如何在 AWS 上进行数据库转储?
- reactjs - 渲染道具与传递功能组件,哪个是首选?
- spring - Spring WebFlux:HttpWebHandlerAdapter - 已建立的连接被中止
- javascript - iframe 悬停时滚动父窗口
- r - 在 U-SQL 中执行 R
- excel - 当单元格在单元格范围内有值时插入新行
- android - Android - 无法解决:cardview-v7
- google-analytics-api - 如何在 api explorer 中使用 Google Analytics API v3 > analytics.management.uploads.uploadData 方法
- angular - 如何在angular2中的路由期间保存数据
- azure - Azure 流分析筛选 IOT 中心输入