Eu tenho esse try
bloco no meu código:
try:
do_something_that_might_raise_an_exception()
except ValueError as err:
errmsg = 'My custom error message.'
raise ValueError(errmsg)
Estritamente falando, na verdade estou levantando outro ValueError
, não o ValueError
jogado por do_something...()
, que é referido err
neste caso. Como anexar uma mensagem personalizada err
? Eu tento o código a seguir, mas falha devido a err
uma ValueError
instância não ser solicitada:
try:
do_something_that_might_raise_an_exception()
except ValueError as err:
errmsg = 'My custom error message.'
raise err(errmsg)
Respostas:
Atualização: para Python 3, verifique a resposta de Ben
Para anexar uma mensagem à exceção atual e aumentá-la novamente: (a tentativa / exceção externa é apenas para mostrar o efeito)
Para python 2.x, em que x> = 6:
Isso também irá fazer a coisa certa , se
err
é derivado deValueError
. Por exemploUnicodeDecodeError
.Observe que você pode adicionar o que quiser
err
. Por exemploerr.problematic_array=[1,2,3]
.Edit: @Ducan aponta em um comentário acima não funciona com o python 3, pois
.message
não é membroValueError
. Em vez disso, você pode usar isso (python válido 2.6 ou posterior ou 3.x):Edit2:
Dependendo da finalidade, você também pode optar por adicionar informações extras com o seu próprio nome de variável. Para python2 e python3:
fonte
print
, provavelmente, deve observar que seu código não funciona no Python 3.x, pois não hámessage
atributo nas exceções.err.args = (err.args[0] + " hello",) + err.args[1:]
pode funcionar de forma mais confiável (e depois converter para uma string para receber a mensagem)..message
atributo faz alguma coisa aqui é que esse atributo é impresso explicitamente . Se você gerasse a exceção sem capturar e imprimir, o atributo não seria.message
útil.Se você tiver sorte o suficiente para suportar apenas o python 3.x, isso realmente se tornará uma coisa de beleza :)
aumentar de
Podemos encadear as exceções usando raise de .
Nesse caso, a exceção que o chamador capturaria tem o número da linha do local onde aumentamos nossa exceção.
Observe que a exceção inferior possui apenas o rastreamento de pilha de onde criamos nossa exceção. O chamador ainda pode obter a exceção original acessando o
__cause__
atributo da exceção que eles capturam.with_traceback
Ou você pode usar with_traceback .
Usando este formulário, a exceção que o chamador capturaria tem o retorno de onde ocorreu o erro original.
Observe que a exceção inferior tem a linha em que executamos a divisão inválida, bem como a linha em que repetimos a exceção.
fonte
raise Exception('Smelly socks') from e
ser modificado para adicionar apenas "meias fedorentas" como um comentário ao traceback original, em vez de introduzir um novo traceback.raise RuntimeError("Something bad happened") from None
impressões:
fonte
raise
sem parâmetros está aumentando novamente. Se o OP quiser adicionar uma mensagem, ele precisará gerar uma nova exceção e poderá reutilizar a mensagem / tipo da exceção original.Parece que todas as respostas estão adicionando informações ao e.args [0], alterando a mensagem de erro existente. Existe uma desvantagem em estender a tupla de args? Eu acho que a possível vantagem é que você pode deixar a mensagem de erro original em paz nos casos em que a análise dessa string é necessária; e você pode adicionar vários elementos à tupla se o tratamento personalizado de erros produziu várias mensagens ou códigos de erro, nos casos em que o traceback seria analisado programaticamente (como por meio de uma ferramenta de monitoramento do sistema).
ou
Você pode ver uma desvantagem dessa abordagem?
fonte
Este modelo de código deve permitir que você crie uma exceção com uma mensagem personalizada.
fonte
Aumente a nova exceção com sua mensagem de erro usando
ou
no local em que você deseja aumentá-lo OU anexar (substituir) a mensagem de erro na exceção atual usando 'from' (somente suporte ao Python 3.x):
fonte
Essa é a função que eu uso para modificar a mensagem de exceção no Python 2.7 e 3.x, preservando o retorno original. Isso requer
six
fonte
As exceções internas do Python 3 têm o
strerror
campo:fonte
A resposta atual não funcionou bem para mim, se a exceção não for capturada novamente, a mensagem anexada não será exibida.
Porém, fazer o mesmo abaixo mantém o rastreamento e mostra a mensagem anexada, independentemente de a exceção ser capturada novamente ou não.
(Eu usei o Python 2.7, não tentei no Python 3)
fonte
Nenhuma das soluções acima fez exatamente o que eu queria, que foi adicionar algumas informações à primeira parte da mensagem de erro, ou seja, eu queria que meus usuários vissem minha mensagem personalizada primeiro.
Isso funcionou para mim:
fonte
Isso funciona apenas com o Python 3 . Você pode modificar os argumentos originais da exceção e adicionar seus próprios argumentos.
Uma exceção lembra os argumentos com os quais foi criada. Presumo que isso seja para que você possa modificar a exceção.
Na função
reraise
, anexamos os argumentos originais da exceção com os novos argumentos que queremos (como uma mensagem). Finalmente, aumentamos novamente a exceção, preservando o histórico de rastreamento.resultado
fonte
se você deseja personalizar o tipo de erro, uma coisa simples que você pode fazer é definir uma classe de erro com base no ValueError.
fonte