2013-08-15 4 views
2

По какой-то причине мой код не перехватывает исключения, когда я его бросаю. У меня естьPython not catching exception

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' и поднимет/поймает это. –

+1

Я удивлен, что это не TypeError. Я думал, что попробовал «за исключением 1:' раньше и получил TypeError, но, попробовав его сейчас, он просто проходит. – user2357112

+0

@ user2357112 Очевидно, это вызывает TypeError в Python 3: http://ideone.com/yy4XAy. Вы правы, хотя это не имеет значения в 2.x –

ответ

7

Вы дали except экземпляр a 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 
... 
>>> 
11

Поймать только 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 
2

изменение

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

в

except IndexError: 
+1

Я добавил для вас цветной синтаксис. – iCodez

2

Вы, кажется, отлов исключения неправильно. Вы перехватываете исключения типа, обозначение ниже присваивает исключение e, чтобы вы могли прочитать описание в своем обработчике.

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

Используйте новые, кроме обозначений: 'except IndexError as e:' – PaulMcG

+0

Выполнено, извините за это – Alex