Respostas:
usar str
try:
some_method()
except Exception as e:
s = str(e)
Além disso, a maioria das classes de exceção terá um args
atributo. Muitas vezes, args[0]
será uma mensagem de erro.
Deve-se observar que o uso de apenas str
retornará uma string vazia se não houver mensagem de erro, enquanto o uso de repr
pyfunc recomenda, pelo menos, exibirá a classe da exceção. Minha opinião é que, se você está imprimindo, é para um usuário final que não se importa com a classe e quer apenas uma mensagem de erro.
Realmente depende da classe de exceção com a qual você está lidando e como ela é instanciada. Você tinha algo em particular em mente?
e.message
porque args[0]
pode não ser realmente uma mensagem.
raise Exception(u'jörn')
. A falha é especialmente ruim, porque você nunca verá a exceção real, mas apenas a UnicodeDecodeError
. Se você não conhece a codificação da exceção (e na maioria das vezes não conhece), deve trabalhar repr(e)
ou, se realmente precisar, usar outro bloco try-except em seu tratamento de exceções, que captura UnicodeDecodeErrors e volta para repr(e)
.
str
(ou mesmo unicode
ou .format
) causou erros devido ao manuseio Unicode. Se você não tiver controle completo do conteúdo da mensagem de erro, use SEMPRE repr
para evitar erros Unicode inesperados.
Use repr () e A diferença entre usar repr e str
Usando repr
:
>>> try:
... print(x)
... except Exception as e:
... print(repr(e))
...
NameError("name 'x' is not defined")
Usando str
:
>>> try:
... print(x)
... except Exception as e:
... print(str(e))
...
name 'x' is not defined
repr
é graças úteis, parece que qualquer outra coisa unicode
, str
, codificando, ... pode gerar uma exceção dependendo da entrada. Não é bem útil quando se tenta manter a exceção para olhar, mas repr é exception-safe
que parece
str()
solução semelhante, porque na verdade inclui o tipo de exceção. Com str()
cheguei 'status'
enquanto repr()
cheguei KeyError('status')
e fiquei tipo "aaaaah, agora entendo o erro".
Mesmo sabendo que essa é uma pergunta antiga, gostaria de sugerir o uso do traceback
módulo para lidar com a saída das exceções.
Use traceback.print_exc()
para imprimir a exceção atual para o erro padrão, assim como seria impressa se permanecesse não capturada ou traceback.format_exc()
para obter a mesma saída que uma string. Você pode passar vários argumentos para qualquer uma dessas funções se desejar limitar a saída ou redirecionar a impressão para um objeto semelhante a um arquivo.
Outra maneira ainda não foi dada:
try:
1/0
except Exception, e:
print e.message
Resultado:
integer division or modulo by zero
args[0]
pode realmente não ser uma mensagem.
str(e)
pode retornar a string com aspas circundantes e, possivelmente, com o u
unicode inicial:
'integer division or modulo by zero'
repr(e)
fornece a representação completa da exceção, que provavelmente não é o que você deseja:
"ZeroDivisionError('integer division or modulo by zero',)"
editar
Foi mal !!! Parece que BaseException.message
foi preterido de2.6
, finalmente, parece definitivamente que ainda não existe uma maneira padronizada de exibir mensagens de exceção. Então, acho que o melhor é lidar com e.args
e str(e)
dependendo de suas necessidades (e possivelmente e.message
se a biblioteca que você está usando depende desse mecanismo).
Por exemplo, com pygraphviz
, e.message
é a única maneira de exibir corretamente a exceção, usando str(e)
envolverá a mensagem u''
.
Mas com MySQLdb
, a maneira correta de recuperar a mensagem é e.args[1]
: e.message
está vazia e str(e)
será exibida'(ERR_CODE, "ERR_MSG")'
Para python2, é melhor usar e.message
para obter a mensagem de exceção, isso evitará possível UnicodeDecodeError
. Mas yes e.message
estará vazio para alguns tipos de exceções OSError
, como , nesse caso, podemos adicionar um exc_info=True
à nossa função de log para não perder o erro.
Para python3, acho seguro usá-lo str(e)
.
Para inspecionar a mensagem de erro e fazer algo com ela (com Python 3) ...
try:
some_method()
except Exception as e:
if {value} in e.args:
{do something}