Как отловить исключение str? - PullRequest
2 голосов
/ 15 мая 2009
import sys
try:
    raise "xxx"
except str,e:
    print "1",e
except:
    print "2",sys.exc_type,sys.exc_value

В приведенном выше коде возникает строковое исключение, которое хотя и устарело, но все еще используется сторонней библиотекой, которую я использую Так как я могу поймать такое исключение, не полагаясь на catch all, что может быть плохо.

кроме str, e: не улавливает? почему?

Система: Python 2.5.2 (r252: 60911, 31 июля 2008 г., 17:28:52) [GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] на linux2

Ответы [ 4 ]

6 голосов
/ 15 мая 2009

Общее предложение except: - единственный способ перехватить все исключения str.

str исключения являются устаревшей функцией Python. В новом коде вы должны использовать raise Exception("xxx") или поднять свой собственный подкласс Exception, или assert 0, "xxx".

4 голосов
/ 15 мая 2009

Вот решение из списка рассылки Python , не очень элегантное, но сработает, если не сможет избежать необходимости такого взлома

import sys
try:
     raise "a string exception"
except:
     e, t, tb = sys.exc_info()
     if not isinstance(e, str):
          raise    
     print "caught", e
2 голосов
/ 15 мая 2009

Поднимать сырые строки просто неправильно. Это устаревшая функция (и поэтому должна была вызывать предупреждения). Перехват явной строки будет работать, если она вам действительно понадобится, и так же будет перехватывать все. Поскольку перехват всех элементов приводит к уродству вашего кода, я рекомендую перехватывать строку явно, а еще лучше: исправлять испорченную библиотеку.

try:
    #code_that_throws_string()
    raise("spam")
except "spam":
    pass

Пропускная инструкция будет достигнута. Существует множество веских причин не использовать строки в качестве исключений, и это одна из них (другая причина: я не верю, что вы можете получить трассировку, поэтому они в основном бесполезны для исправления ошибок).

Итак, почините библиотеку (хорошо). Или перехватить строку явно (плохо). Или поймать все (очень плохо) и выполнить некоторую проверку экземпляра (e, str) (еще хуже).

2 голосов
/ 15 мая 2009
try:
    raise "xxx"

except "xxx":
    print "xxx caught"

except <class> работает только с классами, которые являются подклассом Exception, я думаю. О, кстати, используйте basestring при проверке типа строк, работает также со строками Unicode.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...