Python捕获超类中的错误,并在子类中跟踪它

Python捕获超类中的错误,并在子类中跟踪它,python,exception-handling,Python,Exception Handling,最近,我真的被一些关于错误处理的问题困扰着,我没有在互联网上找到答案: 基本上,我的大多数类都是从处理不同事物的超类降下来的 我只想在这个超类中执行一次错误处理。问题是:我不知道如何将错误跟踪到子类! 到目前为止,我在互联网上找到的最详细的跟踪工具有: exc_type, exc_obj, tb = sys.exc_info() f = tb.tb_frame lineno = tb.tb_lineno filename = f.f_code.co_filename linecache.che

最近,我真的被一些关于错误处理的问题困扰着,我没有在互联网上找到答案:

基本上,我的大多数类都是从处理不同事物的超类降下来的

我只想在这个超类中执行一次错误处理。问题是:我不知道如何将错误跟踪到子类! 到目前为止,我在互联网上找到的最详细的跟踪工具有:

exc_type, exc_obj,  tb = sys.exc_info()
f = tb.tb_frame
lineno = tb.tb_lineno
filename = f.f_code.co_filename
linecache.checkcache(filename)
line = linecache.getline(filename, lineno, f.f_globals)
err_msg = 'Exception in ({}, line {} "{}"): {}'.format(filename, lineno, line.strip(), exc_obj)

traceback.print_stack()
但基本上,它只会引导我到超类中我试图显示它的那一行,所以我不知道它来自哪里,最后我到处都使用打印来跟踪我的错误:/

所以基本上:

lots of lines of the API I don't understand like base.py line 90570930 in blablabla
File -blablabla- super_view.py, line 8, in myMethod
   traceback.print_stack()
~==~超类~==~

1 class MySuperClass(-stuff-):
2    class Meta:
3       abstract = True
4    -stuff-
5 
6    def myMethod(-stuff-):
7       try:
8          context = self.myChildMethod(-stuff-)
9       except Exception as e:
10         -display the error from e, and log it-
1 class ChildClass(MySuperClass):
2    def myChildMethod:
3       -stuff1-
4       -stuff2-
5       -stuff3-
6       return -somestuff-
~==~我的孩子班级~==~

1 class MySuperClass(-stuff-):
2    class Meta:
3       abstract = True
4    -stuff-
5 
6    def myMethod(-stuff-):
7       try:
8          context = self.myChildMethod(-stuff-)
9       except Exception as e:
10         -display the error from e, and log it-
1 class ChildClass(MySuperClass):
2    def myChildMethod:
3       -stuff1-
4       -stuff2-
5       -stuff3-
6       return -somestuff-
例如,如果我的错误来自-stuff2-,那么我希望在第4行获得它来自包含“ChildClass”的文件的信息

但是,我得到的最多是超类的文件,在第8行

print_stack()基本上如下所示:

lots of lines of the API I don't understand like base.py line 90570930 in blablabla
File -blablabla- super_view.py, line 8, in myMethod
   traceback.print_stack()
那么,有没有一种方法可以回到错误真正来自的子类呢


我相信应该有一个,但是。。。我已经搜索了一段时间,但我仍然无法解决这个问题,因此,如果任何python专家(或有丰富经验的人)都知道这一点……

这是因为您在父类中处理了异常。你有两个选择:-

1) 在子类中捕获异常,方法是将try..catch放在stuff2周围并记录它。 2) 如果要捕获父类中的异常,则使用

raise e, None, sys.exec_info()[2] 

并将try-catch放入子类中的stuff2中,正如我在第1点中所说。

如果您知道
stuff2()
生成异常,并且您可以编辑代码,请尝试以下操作:
try:stuff2()
,并使用以下方法处理异常:
除外:导入pdb;pdb.post_mortem()
,这将在生成异常的确切行启动调试器。我不知道stuff2正在生成异常,它可能是stuff1、stuff3或任何东西(当然我会查看最近添加的内容,但…这不是重点)。我希望能够在我的超类而不是子类中处理该异常。否则,把try~~~~除了放在每个孩子的课堂上就行了。还是谢谢你的回答。所以基本上,如果不在儿童课上抓住它,就没有办法获得我渴望的信息了?我想我不可能那么懒=(可能还有其他繁忙的方法,但这会降低代码的直观性并降低其灵活性。例如,您可以访问执行堆栈并找到超类函数的调用函数,这样您可以获得有关stuff2的信息,但我不建议您这样做。好的,使用type(self).\uuuu name\uuuuu我已经访问了子类名称。好的,谢谢,那就没办法了,我想我会在所有子类中添加try~catch语句。