Skip to main content
 首页 » 编程设计

Python IndexError 被抛出,即使它在两个 except block 内

2025年05月04日16EasonJim

这可能是一个非常愚蠢的错误,但唉,我是 Python 的新手,我发现这个错误令人费解,因此我们将不胜感激。这可能是一个相对简单的错误,但在网站上搜索目前还没有解决问题。这是给我所有这些问题的方法:

def loggable(func): 
    def log(self, *args, **kwargs): 
        try: 
            return func(self, *args, **kwargs) 
        except Exception as ex: 
            import traceback 
            import sys 
            tb = sys.exc_info()[2] 
            exception_string = traceback.format_exception(type(ex), ex, tb) 
            [self.error_log.appendText(item) for item in exception_string] 
 
            m = qg.QMessageBox() 
            m.setIcon(m.Warning) 
            m.setText(ex.args[0]) 
            try: 
                m.setInformativeText(str(ex.args[1])) 
            except IndexError: 
                pass 
            try: 
                m.setDetailedText(str(ex.args[2])) 
            except IndexError: 
                pass 
            m.exec_() 
            raise 
 
    return log 

这一行的异常

m.setDetailedText(str(ex.args[2])) 

被抛出,即使它不在一个而是两个 catch block 中。我试图弄清楚问题可能是什么,我们将不胜感激。

这是回溯:

Traceback (most recent call last): 
  File "/home/skylion/Git/popupcad/popupcad/guis/editor.py", line 335, in <lambda> 
    popupcad.manufacturing.joint_operation2.JointOperation2)}}) 
  File "/home/skylion/Git/popupcad/popupcad/guis/editor.py", line 51, in log 
    m.setDetailedText(str(ex.args[2])) 
IndexError: tuple index out of range 

请您参考如下方法:

外部异常处理程序的最后一行是 raise,它将重新引发最后一个异常,这显然是在尝试调用 m.setDetailedText。这失败了,但它的异常现在是最近的,并且在你最后点击 raise 时被重新引发。

要引发原始异常,将其从 raise 更改为 raise ex