exception exceções - Criando manualmente (jogando) uma exceção em Python





tratamento recent (5)


NÃO FAÇA ISSO . Criar uma Exception nua não é absolutamente a coisa certa a fazer; veja share lugar.

Não pode ficar muito mais pythonic do que isso:

raise Exception("I know python!")

Veja os documentos da instrução raise para python se você quiser mais informações.

Como posso gerar uma exceção no Python para que ela possa ser capturada posteriormente por meio de um bloco except ?




Leia as respostas existentes primeiro, isto é apenas um adendo.

Observe que você pode gerar exceções com ou sem argumentos.

Exemplo:

raise SystemExit

sai do programa, mas você pode querer saber o que aconteceu. Então você pode usar isso.

raise SystemExit("program exited")

isto imprimirá "programa saiu" para stderr antes de fechar o programa.




Para o caso comum onde você precisa lançar uma exceção em resposta a algumas condições inesperadas, e que você nunca pretende capturar, mas simplesmente falhar rapidamente para permitir que você depure a partir de lá se isso acontecer - o mais lógico parece ser AssertionError :

if 0 < distance <= RADIUS:
    #Do something.
elif RADIUS < distance:
    #Do something.
else:
    raise AssertionError("Unexpected value of 'distance'!", distance)



No Python3 existem 4 sintaxes diferentes para exceções do rasing:

1. raise exception 
2. raise exception (args) 
3. raise
4. raise exception (args) from original_exception

1. raise exception vs. 2. raise exception (args)

Se você usar raise exception (args) para gerar uma exceção, então os args serão impressos quando você imprimir o objeto de exceção - como mostrado no exemplo abaixo.

  #raise exception (args)
    try:
        raise ValueError("I have raised an Exception")
    except ValueError as exp:
        print ("Error", exp)     # Output -> Error I have raised an Exception 



  #raise execption 
    try:
        raise ValueError
    except ValueError as exp:
        print ("Error", exp)     # Output -> Error 

3.raise

instrução raise sem nenhum argumento re-levanta a última exceção. Isso é útil se você precisar realizar algumas ações depois de capturar a exceção e, em seguida, desejar aumentá-la novamente. Mas se não houve nenhuma exceção antes, a instrução raise gera exceção TypeError .

def somefunction():
    print("some cleaning")

a=10
b=0 
result=None

try:
    result=a/b
    print(result)

except Exception:            #Output ->
    somefunction()           #some cleaning
    raise                    #Traceback (most recent call last):
                             #File "python", line 8, in <module>
                             #ZeroDivisionError: division by zero

4. raise exception (args) de original_exception

Essa instrução é usada para criar o encadeamento de exceções, no qual uma exceção levantada em resposta a outra exceção pode conter os detalhes da exceção original - conforme mostrado no exemplo abaixo.

class MyCustomException(Exception):
pass

a=10
b=0 
reuslt=None
try:
    try:
        result=a/b

    except ZeroDivisionError as exp:
        print("ZeroDivisionError -- ",exp)
        raise MyCustomException("Zero Division ") from exp

except MyCustomException as exp:
        print("MyException",exp)
        print(exp.__cause__)

Saída:

ZeroDivisionError --  division by zero
MyException Zero Division 
division by zero



Você deve sobrescrever os métodos __repr__ ou __unicode__ vez de usar message, os argumentos que você fornece quando constrói a exceção estarão no atributo args do objeto de exceção.





python exception exception-handling