Crie exceções personalizadas em Python
- Crie uma classe de exceção personalizada em Python
-
Execute o tratamento de exceções usando o bloco
try...except
em Python
Este tutorial demonstrará que você pode criar classes de exceção personalizadas em Python. Aqui, mostraremos como você pode executar adequadamente o tratamento de exceções, definir classes de exceção personalizadas e substituir as exceções integradas existentes.
Exceções são um tipo de evento que ocorre sempre que algo dentro de um programa não sai como pretendido ou interrompe o fluxo do caso de uso pretendido do programa. Sem o tratamento de exceções, o programa deixará de ser executado totalmente e a exceção deverá ser corrigida ou tratada.
Crie uma classe de exceção personalizada em Python
A criação de uma classe de exceção em Python é feita da mesma maneira que uma classe normal. A principal diferença é que você tem que incluir a classe base do Python Exception
para informar ao compilador que a classe que você está criando é uma classe de exceção.
Vamos testar esse método para criar uma classe de exceção chamada DemoException
e usar a palavra-chave de fluxo de controle de espaço reservado pass
para dentro como um espaço reservado.
class DemoException(Exception):
pass
Execute Exception-Raising usando a palavra-chave raise
em Python
Para testar a classe DemoException
e ver o que ela exibe quando é realmente disparada, execute o levantamento da exceção. O lançamento de exceções é sinônimo de lançamento de exceções em outras linguagens de programação.
Usando a palavra-chave raise
, acione uma exceção usando a classe de exceção fornecida e produza uma mensagem de exceção.
class DemoException(Exception):
pass
raise DemoException
Resultado:
Traceback (most recent call last):
File "/Users/demo/python/demo_exception.py", line 4, in <module>
raise DemoException
__main__.DemoException
Uma exceção padrão aparecerá no terminal se nenhuma mensagem de exceção personalizada tiver sido declarada.
Declare uma mensagem de exceção personalizada em Python
Para declarar uma mensagem de exceção personalizada para DemoException
, substitua o método __init__()
da classe de exceção e inclua a mensagem que deve ser emitida para a exceção nos parâmetros, junto com o parâmetro auto-referencial obrigatório self
.
Por exemplo, vamos substituir o método __init__()
e criar uma mensagem personalizada para a classe DemoException
:
class DemoException(Exception):
def __init__(self, message):
super().__init__(message)
Observe que, para que a mensagem seja integrada à sua exceção com sucesso, chame a classe base Exception
, método __init__()
e inclua a message
como um argumento.
Vamos chamar a classe de exceção novamente usando a palavra-chave raise
e agora, passando uma mensagem personalizada com ela:
class DemoException(Exception):
def __init__(self, message):
super().__init__(message)
message = "Exception Triggered! Something went wrong."
raise DemoException(message)
A saída deve ser semelhante a esta:
Traceback (most recent call last):
File "/Users/demo/python/helloworld.py", line 6, in <module>
raise DemoException(message)
__main__.DemoException: Exception Triggered! Something went wrong.
Agora, criamos e acionamos com sucesso uma classe de exceção com uma mensagem de erro personalizada.
Para situações reais que podem disparar uma exceção, como tratamos e levantamos essas exceções? Você pode resolver este problema perfeitamente implementando o tratamento de exceções usando o bloco try...except
.
Execute o tratamento de exceções usando o bloco try...except
em Python
O bloco try...except
é muito parecido com o bloco try-catch
em outras linguagens como Java.
O bloco try...except
tem 2 blocos principais e 2 blocos opcionais:
try
(obrigatório) - O bloco principal responsável por encapsular o bloco de código onde a exceção pode ser disparada. O blocotry
interrompe todo o processo dentro dele sempre que uma exceção é acionada.except
(obrigatório) - O programa de bloco continua sempre que uma exceção especificada é acionada. Este bloco normalmente contém uma mensagem de erro descritiva para o chamador ou apenas uma simples instruçãoprint()
. Pode haver mais de um blocoexcept
em um único blocotry
, cada um capturando diferentes exceções.else
(opcional) - Este bloco opcional é onde o programa prosseguirá se o blocotry
não disparou nenhuma exceção.finally
(opcional) - Este bloco opcional é executado uma vez que tudo dos 3 blocos anteriores foi executado, independentemente se uma exceção é acionada ou não.
Vamos usar o exemplo anterior usando a classe DemoException
para tentar um bloco try...except
simples.
Primeiro, envolva a palavra-chave raise
em uma função e coloque-a dentro do bloco try...except
.
A função que criaremos para este exemplo é uma função que aceita um número e lança uma exceção se enviar 0
. Se enviar qualquer outro número, o código continuará conforme o planejado. Veja o exemplo abaixo:
class DemoException(Exception):
def __init__(self, message):
super().__init__(message)
message = "Exception Triggered! Something went wrong."
def triggerException(num):
if num == 0:
raise DemoException(message)
else:
print(num)
try:
triggerException(0)
print("Code has successfully been executed.")
except DemoException:
print("Error: Number should not be 0.")
Visto que triggerException()
passou 0
como um argumento, o código deve acionar DemoException
. Aqui, devemos esperar que a mensagem de palavra-chave raise
seja substituída por tudo o que está dentro do bloco except
como saída.
Observe que a linha print()
após a chamada da função triggerException()
não foi emitida. É porque a função gerou uma exceção; portanto, ele imediatamente interrompeu todos os processos dentro do bloco try
e prosseguiu diretamente para o bloco except
.
Resultado:
Error: Number should not be 0.
Agora, vamos tentar passar um número válido como 20
, por exemplo.
try:
triggerException(20)
print("Code has successfully been executed.")
except DemoException:
print("Error: Number should not be 0.")
Resultado:
20
Code has successfully been executed.
Vamos tentar encadear os blocos except
e criar outra exceção. Vamos chamar a nova exceção de NumberFormatException
, que dispara se a entrada fornecida não for um número. Para esta classe de exceção, vamos declarar a mensagem dentro da classe.
class NumberFormatException(Exception, value):
message = f"{value} is not a number"
def __init__(self):
super().__init__(message)
Agora, modifique o código acima para lidar com a nova classe de exceção NumberFormatException
:
class DemoException(Exception):
def __init__(self, message):
super().__init__(message)
class NumberFormatException(Exception):
def __init__(self, message, value):
message = f"{value} is not a number"
super().__init__(message)
message = "Exception occured."
def triggerException(num):
if not num.isdigit():
raise NumberFormatException(message, num)
elif num == 0:
raise DemoException(message)
else:
print(num)
num = "sample string"
try:
triggerException(num)
print("Code has successfully been executed.")
except DemoException:
print("Error: Number should not be 0.")
except NumberFormatException:
print(num + " is not a number.")
Neste código, o valor de num
que foi passado para triggerException()
é uma string 'sample string'
, portanto, NumberFormatException
deve ser acionada.
Resultado:
sample string is not a number.
Em resumo, criar exceções personalizadas em Python é tão simples quanto criar uma nova classe, mas com a classe Exception
como um argumento extra na definição de classe. A palavra-chave raise
é usada para disparar exceções dada a Classe de Exceção. Os blocos try...except
são usados para envolver uma ou mais exceções dentro de um bloco de código e modificar o que o código faz ao lidar com essa exceção e não apenas encerrar o programa completamente.
Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.
LinkedIn