Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 向下投射对象以隐藏低级错误的最佳方法_Python_Python 3.x_Error Handling - Fatal编程技术网

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继承,隐藏继承链没有意义,因为客户端代码不应该需要它。我不明白你所说的追踪不相关是什么意思。应该始终抛出异常,以便下游客户端正确处理它们,并且每个异常都有一个与之相关联的回溯。