【问题标题】:Python still throwing exception I've explicitly exceptedPython 仍然抛出异常,我已明确排除
【发布时间】:2019-09-06 12:30:56
【问题描述】:

我知道一些代码在列表为空的边缘情况下会失败,因此我为IndexError 添加了异常处理。

但是,尽管处理了异常,它仍然被引发。

~/Code/foo.py in decode_tokens(tokens)
    196                 new_toks.append(new_tok)
    197             else:
--> 198                 try: new_toks[-1] += new_tok
    199                 except IndexError: pass
    200             new_elem = True

IndexError: list index out of range

我不明白如果我明确排除 IndexError 为什么它仍然会引发并中止脚本执行。

编辑:补充说这是在 Jupyter 笔记本中运行的 Python 3.6。因为它看起来像一个 python 错误,所以我认为这不相关(但听起来可能是。)

【问题讨论】:

  • 向我们展示一下代码中的语句是什么样子的?你能用minimal reproducible example更新你的问题吗?
  • 我无法复制
  • 我不认识那个运行环境。你在调试器中运行吗?尽管脚本不应该失败,但有些可能仍会显示异常。如果您从命令行运行脚本,您会看到什么?
  • 让我们来讨论一个稍微远一点的问题。你使用的是 Spyder/Enthought Canopy 还是其他支持 IPython 的东西?
  • 在这种情况下,如果您在代码运行时修改了模块,那么该异常很可能是一个可怕的巧合。 Jupyter 有一个底层的 IPython 内核,当在一个已经被编辑过的模块中抛出异常时,很可能会出现行不匹配。重启内核

标签: python python-3.x exception index-error


【解决方案1】:

支持 IPython 的编辑器(包括 Jupyter)即使在模块被编辑后也不总是重新加载模块。我认为这可能是一个不幸的巧合;抛出错误的行恰好与编辑之后的异常处理程序的行一致。可能引发错误的代码现在不是该行的代码。您可能希望在每次运行脚本时强制重新加载导入的模块,或者至少现在重新启动底层 IPython 内核。

【讨论】:

  • 我添加了异常处理,因为这行昨晚抛出了IndexError。该模块应该已经用%reload_ext autoreload %autoreload 2 重新加载,但我认为你是对的,发生了一些奇怪的事情,它实际上并没有正确地重新加载异常处理代码。
  • Ahhhhh,重新加载内核,现在看看重新加载模块的实际问题是什么。它没有默默地这样做(但仍然在错误消息中显示更新的代码)!我在服务器上使用添加制表符而不是空格的不同编辑器添加了修补程序异常处理:“TabError:缩进中制表符和空格的不一致使用”。感谢您指向正确方向的指针!
  • @BradDwyer 我本来希望更详细地回答它在 IPython 中的工作原理,但我对所有这些不匹配是如何产生的没有足够详细的了解。当然,我已经看到了奇怪的回溯,其中行内容与我的实际脚本不匹配,但可能会出现许多其他问题。
  • 不用担心,我只需要指向正确的方向。我走错了兔子洞,我想IndexError 可能有点特别,或者我的错误处理不正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
  • 2017-08-29
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多