Python未捕获异常

Python未捕获异常,python,Python,由于某些原因,我的代码在抛出异常时没有捕获异常。我有 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

由于某些原因,我的代码在抛出异常时没有捕获异常。我有

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

但我还是得到了一个例外的回溯。我做错了什么?

只捕获
索引器

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:
    raise IndexError('abc')
except IndexError as err:
    print err


abc

您提供了
索引器的
实例,但
除外。改为这样做:

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
...
>>>
>>试试:
...     [1][1]
... 除索引器(“否”)外:
...     通过
...
回溯(最近一次呼叫最后一次):
文件“”,第2行,在
索引器:列表索引超出范围
>>>尝试:
...     [1][1]
... 除索引器外:
...     通过
...
>>>
更改

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


你似乎捕捉到了错误的异常。如果捕获类型为的异常,下面的符号会将异常分配给e,以便您可以在except处理程序中读取描述

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

您应该只将类型名放在那里,而不是该类型的实例。如果您想进一步缩小它的范围,只处理将要抛出的特殊的
索引器
,而不使用常规的ole
索引器
,请创建一个从
索引器
继承的更窄的异常类型,并引发/捕获它。我很惊讶这不会导致类型错误。我以为我以前尝试过
,除了1:
,但得到了一个TypeError,但现在尝试,它只是通过了。@user2357112显然它确实在Python 3中导致了一个TypeError:。不过你说得对,2分钟内没关系。x@Asad奇怪的是,没有任何警告说我做错了。因此,如果我想捕获该特定错误而不是其他
索引器
,那么子类
索引器
,或者解析消息并重新引发错误(如果不是指定的消息)是否更为标准?我只在这个例子中使用了这个错误,创建一个新的子类会不会有点过于繁重?@ari最好将indexer子类化(至少在IMO),但这完全取决于您。这两种方法都可以工作,尽管在关键的决策和控制流中使用字符串比较总是让我感到恶心。我不是Python专家,所以YMMV。请使用new-except表示法:
except-indexer作为e:
Done,很抱歉
except IndexError:
try:
    modrad, thetas = trim_rad(rad)
except IndexError as e:
    print e.message
    return 0