ipython notebook 中的块除外未捕获异常

Except block not catching exception in ipython notebook

当我在当前 Python 环境(一个 ipython 笔记本单元格)中尝试这个简单示例时,我无法捕获 TypeError 异常:

a = (2,3)
try:
  a[0] = 0
except TypeError:
  print "catched expected error"
except Exception as ex:
  print type(ex), ex

我得到:

<type 'exceptions.TypeError'> 'tuple' object does not support item assignment

当我尝试在同一台计算机上的不同 ipython 笔记本中 运行 相同的复制粘贴代码时,我得到了预期的输出:catched expected error.

我知道这与我现在的环境有关,但我不知道从哪里开始看!我还尝试了另一个带有 AttributeError 的示例,在这种情况下,catch 块有效。

编辑: 当我尝试时:

   >>> print AttributeError
   <type 'exceptions.AttributeError'>
   >>> print TypeError
   <type 'exceptions.AttributeError'>

我记得在会话的早些时候我犯了一个错误,它重命名为 TypeError:

try:
    group.apply(np.round, axis=1) #group is a pandas group
except  AttributeError, TypeError : 
#it should have been except  (AttributeError, TypeError)
    print ex

这给了我:

 ('rint', u'occurred at index 54812')

我认为可能是某些环境必须隐式导入 TypeError:

from exceptions import TypeError

试试吧!

这行错误在这里:

except  AttributeError, TypeError :

这意味着:捕获类型 AttributeError 的异常,并将该异常分配给名称 TypeError。实际上,您是这样做的:

except AttributeError as e:
    TypeError = e  # instance of AttributeError!

您可以通过

纠正这个问题
del TypeError

以便Python再次找到内置类型。

更好的解决方案是使用正确的语法:

except (AttributeError, TypeError):

由于该错误很容易犯,Python 2.6 added the except .. as syntax,并且使用 except Exception, name: 的旧语法已从 Python 3 中删除一共