Python 向下投射对象以隐藏低级错误的最佳方法
我有一个围绕Python 向下投射对象以隐藏低级错误的最佳方法,python,python-3.x,error-handling,Python,Python 3.x,Error Handling,我有一个围绕pyodbc的库。良好的设计要求它对客户机隐藏所有pyodbc知识。这也意味着客户端必须处理mylib.Error,而不是pyodbc.Error。除此之外,只需在mylib中捕获pyodbc.Error,并将其替换为mylib.Error是很难看的,因为回溯显示的是级联异常,而不是一个异常: pyodbc.DataError:(…字符串或二进制数据将被截断…) 在处理上述异常期间,发生了另一个异常: 回溯(最近一次呼叫上次): 因此,隐藏戈尔细节的最佳方法是抛出异常: import
pyodbc
的库。良好的设计要求它对客户机隐藏所有pyodbc知识。这也意味着客户端必须处理mylib.Error
,而不是pyodbc.Error
。除此之外,只需在mylib
中捕获pyodbc.Error
,并将其替换为mylib.Error
是很难看的,因为回溯显示的是级联异常,而不是一个异常:
pyodbc.DataError:(…字符串或二进制数据将被截断…)
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫上次):
因此,隐藏戈尔细节的最佳方法是抛出异常:
import pyodbc
class DataTruncated(pyodbc.DataError):
pass
def execute(sql):
dbcursor = pyodbc.connect(database="mydb").cursor()
try:
dbcursor.execute(sql)
except pyodbc.Error as e:
if 'truncated' in e.args[1]:
e.__class__ = DataTruncated
raise
是否有更好的方法处理此问题?如果回溯超出此点是相关的,则表明您的库不够抽象。既然你发现了这个错误,你能不能就正在发生的事情提供一些信息,这样就根本不需要回溯了?还有,如果你想隐藏pydobc,您不应该从pyodbc异常继承您的异常-只需创建您自己的异常层次结构-可能只是从与您的用户语义相关的Python异常继承(ValueError、RuntimeError等…@jsbueno pyodbc Exception已经从Exception继承,隐藏继承链没有意义,因为客户端代码不应该需要它。我不明白你所说的追踪不相关是什么意思。应该始终引发异常,以便下游客户端正确处理它们,并且每个异常都有一个与之关联的回溯。如果回溯超出此点是相关的,则表明您的库没有足够抽象。既然你发现了这个错误,你能不能就正在发生的事情提供一些信息,这样就根本不需要回溯了?还有,如果你想隐藏pydobc,您不应该从pyodbc异常继承您的异常-只需创建您自己的异常层次结构-可能只是从与您的用户语义相关的Python异常继承(ValueError、RuntimeError等…@jsbueno pyodbc Exception已经从Exception继承,隐藏继承链没有意义,因为客户端代码不应该需要它。我不明白你所说的追踪不相关是什么意思。应该始终抛出异常,以便下游客户端正确处理它们,并且每个异常都有一个与之相关联的回溯。