Python未捕获异常

7
由于某些原因,我的代码在我抛出异常时没有捕获它。我有:
def trim_rad(rad):
    ...

    if not modrad.shape[0]:
        raise IndexError("Couldn't find main chunk")
    return modrad, thetas

然后我稍后调用那个函数:
try:
    modrad, thetas = trim_rad(rad)
except IndexError("Couldn't find main chunk"):
    return 0

即使如此,我仍然收到了该异常的回溯信息。我做错了什么?

5
你只需要在那里放置类型名称,而不是类型的实例。如果您想进一步缩小范围,仅处理您将引发的特殊“IndexError”,并使常规“IndexErrors”保持不变,请创建一个从“IndexError”继承的更窄的异常类型,并引发/捕获该类型。 - Asad Saeeduddin
1
我很惊讶这没有TypeError错误。我以前尝试过except 1:,但是得到了一个TypeError错误,但是现在尝试一下,它就可以通过了。 - user2357112
1
@ari 我认为最好是子类化IndexErrors,但完全由你决定。两种方法都可以,尽管对于关键决策和控制流程使用字符串比较总是让我感到不舒服。我不是Python专家,所以可能因人而异。 - Asad Saeeduddin
@ari 如果你使用的是Python 3,它会大声崩溃(请参见http://ideone.com/xUlGsy),但在Python 2中情况要宽松一些。 - Asad Saeeduddin
@Asad 那种“宽松性”有什么用处吗?让人们在 except 后面放置一些不是错误的东西有什么目的呢? - ari
显示剩余2条评论
4个回答

13

只捕获IndexError异常。

try:
    raise IndexError('abc')
except IndexError('abc'):
    print 'a'



Traceback (most recent call last):
  File "<pyshell#22>", line 2, in <module>
    raise IndexError('abc')
IndexError: abc

try:
    raise IndexError('abc')
except IndexError:
    print 'a'


a # Output

因此,将您的代码简化为

try:
    modrad, thetas = trim_rad(rad)
except IndexError:
    return 0

如果你想捕获错误信息,可以使用以下语法:

try:
    raise IndexError('abc')
except IndexError as err:
    print err


abc

10

您给except提供了一个IndexError的实例。请改为以下操作:

try:
    modrad, thetas = trim_rad(rad)
except IndexError:
    print "Couldn't find main chunk"
    return 0

以下是一个例子:

>>> try:
...     [1][1]
... except IndexError('no'):
...     pass
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
IndexError: list index out of range
>>> try:
...     [1][1]
... except IndexError:
...     pass
...
>>>

3

改变

except IndexError("Couldn't find main chunk"):

to

except IndexError:

3

您似乎捕获异常的方式不正确。 您应该捕获特定类型的异常,下面的表示法将异常分配给e,以便您可以在except处理程序中读取描述。

try:
    modrad, thetas = trim_rad(rad)
except IndexError as e:
    print e.message
    return 0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接