Python IndexError被抛出,即使它在除了块之外的两个内部

时间:2015-06-30 19:30:29

标签: python python-2.7 exception error-handling runtimeexception

这可能是一个非常愚蠢的错误,但是我对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]))

正在抛出,即使它不是一个而是两个捕获块。我想弄清楚问题可能是什么,任何帮助将不胜感激。

这是追溯:

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

2 个答案:

答案 0 :(得分:3)

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

要提出原始例外,请将其从raise更改为raise ex

答案 1 :(得分:3)

根据文档,您的上一个语句class HtmlDivFormatter { private $data; public function __construct($data) { $this->data = $data; } public function __toString() { return '<div>' . $this->data['column_name'] . '</div>'; // whatever HTML you have in mind } } while ($data = $stmt->fetch( PDO::FETCH_ASSOC )) { $html = new HtmlDivFormatter($data); echo $html; } 将重新引发先前的异常。

https://docs.python.org/2/tutorial/errors.html#raising-exceptions