Se eu tiver esse código:
try:
some_method()
except Exception, e:
Como posso obter esse valor de exceção (representação de cadeia, quero dizer)?
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
porqueargs[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 aUnicodeDecodeError
. Se você não conhece a codificação da exceção (e na maioria das vezes não conhece), deve trabalharrepr(e)
ou, se realmente precisar, usar outro bloco try-except em seu tratamento de exceções, que captura UnicodeDecodeErrors e volta pararepr(e)
.str
(ou mesmounicode
ou.format
) causou erros devido ao manuseio Unicode. Se você não tiver controle completo do conteúdo da mensagem de erro, use SEMPRErepr
para evitar erros Unicode inesperados.Usando
repr
:Usando
str
:fonte
repr
é graças úteis, parece que qualquer outra coisaunicode
,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 parecestr()
solução semelhante, porque na verdade inclui o tipo de exceção. Comstr()
cheguei'status'
enquantorepr()
chegueiKeyError('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 outraceback.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.fonte
Outra maneira ainda não foi dada:
Resultado:
args[0]
pode realmente não ser uma mensagem.str(e)
pode retornar a string com aspas circundantes e, possivelmente, com ou
unicode inicial:repr(e)
fornece a representação completa da exceção, que provavelmente não é o que você deseja: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 come.args
estr(e)
dependendo de suas necessidades (e possivelmentee.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, usandostr(e)
envolverá a mensagemu''
.Mas com
MySQLdb
, a maneira correta de recuperar a mensagem ée.args[1]
:e.message
está vazia estr(e)
será exibida'(ERR_CODE, "ERR_MSG")'
fonte
Para python2, é melhor usar
e.message
para obter a mensagem de exceção, isso evitará possívelUnicodeDecodeError
. Mas yese.message
estará vazio para alguns tipos de exceçõesOSError
, como , nesse caso, podemos adicionar umexc_info=True
à nossa função de log para não perder o erro.Para python3, acho seguro usá-lo
str(e)
.fonte
Se você não souber o tipo / origem do erro, tente:
Mas esteja ciente, você receberá o aviso pep8:
fonte
Para inspecionar a mensagem de erro e fazer algo com ela (com Python 3) ...
fonte