Відповіді:
використання str
try:
some_method()
except Exception as e:
s = str(e)
Також більшість класів виключень матимуть args
атрибут. Часто args[0]
буде повідомлення про помилку.
Слід зазначити, що просто використання str
поверне порожню рядок, якщо немає повідомлення про помилку, тоді як використання, repr
як рекомендує pyfunc, принаймні відображатиме клас виключення. Я вважаю, що якщо ви роздруковуєте його, це для кінцевого користувача, який не байдуже, що це за клас, і просто хоче повідомлення про помилку.
Це дійсно залежить від винятку класу, з яким ви маєте справу, і від того, як він створений. Ви щось мали на увазі?
e.message
тому args[0]
що насправді це не може бути повідомленням.
raise Exception(u'jörn')
. Невдача особливо погана, тому що ви ніколи не побачите фактичного винятку, а лише а UnicodeDecodeError
. Якщо ви не знаєте кодування винятку (і більшу частину часу цього не робите), вам слід працювати repr(e)
або якщо вам дійсно потрібно, скористайтеся іншим блоком для випробувань, крім вашого обліку виключень, який вловлює UnicodeDecodeErrors і повертається до repr(e)
.
str
(або навіть unicode
або .format
) викликали помилки через обробку Unicode. Якщо ви не маєте повного контролю над вмістом повідомлення про помилку, ЗАВЖДИ використовуйте, repr
щоб уникнути несподіваних помилок Unicode.
Використовуйте repr () та Різниця між repr та str
Використання repr
:
>>> try:
... print(x)
... except Exception as e:
... print(repr(e))
...
NameError("name 'x' is not defined")
Використання str
:
>>> try:
... print(x)
... except Exception as e:
... print(str(e))
...
name 'x' is not defined
repr
корисно , спасибі, це , здається , що -то ще unicode
, str
що кодує, ... може викликати виключення в залежності від вхідного сигналу. Не зовсім корисно при спробі зберегти виняток на вигляд, але передрук exception-safe
здається
str()
подібні рішення, оскільки воно фактично включає тип винятку. Коли str()
я в 'status'
той час, як repr()
я отримав, KeyError('status')
і я був як "аааааа, тепер я розумію помилку".
Хоча я усвідомлюю, що це давнє питання, я хотів би запропонувати використовувати traceback
модуль для обробки результатів винятків.
Використовуйте traceback.print_exc()
для друку поточного винятку зі стандартною помилкою, подібно до того, як вона буде надрукована, якби вона залишилася не збереженою, або traceback.format_exc()
щоб отримати той же вихід, що і рядок. Ви можете передати різні аргументи до будь-якої з цих функцій, якщо ви хочете обмежити висновок або перенаправити друк на файл-подібний об’єкт.
Ще не вказано іншого способу:
try:
1/0
except Exception, e:
print e.message
Вихід:
integer division or modulo by zero
args[0]
може насправді не бути повідомленням.
str(e)
може повернути рядок з навколишніми лапками і, можливо, з провідним, u
якщо unicode:
'integer division or modulo by zero'
repr(e)
дає повне уявлення про виключення, яке, мабуть, не те, що ви хочете:
"ZeroDivisionError('integer division or modulo by zero',)"
редагувати
Моє ліжко !!! Здається, що BaseException.message
це застаріло2.6
, нарешті, напевно здається, що досі не існує стандартизованого способу відображення повідомлень про виключення. Тож я гадаю, що найкраще - це займатися e.args
і str(e)
залежно від ваших потреб (і, можливо, e.message
якщо використовувана вами покладається на цей механізм).
Наприклад, з pygraphviz
, e.message
єдиний спосіб відобразити виняток, використовуючи str(e)
оточує повідомлення u''
.
Але з MySQLdb
правильним способом отримання повідомлення є e.args[1]
: e.message
порожнє і str(e)
відображатиметься'(ERR_CODE, "ERR_MSG")'
Для python2, краще використовувати e.message
для отримання повідомлення про виняток, це уникне можливого UnicodeDecodeError
. Але так e.message
буде порожнім для деяких винятків, наприклад OSError
, у цьому випадку ми можемо додати exc_info=True
до нашої функції реєстрації даних, щоб не пропустити помилку.
Для python3 я думаю, що це безпечно у використанні str(e)
.
Щоб перевірити повідомлення про помилку і зробити щось із ним (з Python 3) ...
try:
some_method()
except Exception as e:
if {value} in e.args:
{do something}