Clique sobre os tópicos listados abaixo para navegar até o conteúdo desejado.

  1. Bloco try-catch
  2. Capturar mais de uma exceção
  3. Bloco finally
  4. Comando With
  5. Uso do try-catch

A linguagem Python possui um recurso para tratamento de erro em que podemos definir um bloco de código para que seja testado. Caso algum erro ocorra, uma exceção será retornada para que possamos fazer o devido tratamento.

Nesta parte do tutorial, vamos estudar os blocos try, except e finally que respectivamente testam, tratam e finalizam um bloco de código.

Para o tratamento de erros mencionada acima, Python fornece os comando try e except que devem ser usados em conjunto.

Sintaxe
try:
    #código
except nome_excecao
    #tratamento
Onde
try: possui um corpo de código que será executado
except: comando para capturar erro lançado em try.
nome_excecao: tipo de dado da exceção lançada, nativa ou do criada pelo usuário

Quando o try é utilizado, as declarações dentro do corpo/bloco são executadas. Caso algum erro ocorra, uma Exceção(Exception) é gerada e o fluxo de execução é desviado para o bloco except que deve realizar o devido tratamento da exceção.

Exemplo 1
try:
    print(1/0)
except ZeroDivisionError: #divisão por 0
    print("Erro: ZeroDivisionError")
Saída
Erro: ZeroDivisionError

O bloco except é alimentado por um objeto que contem as informações sobre a exceção ocorrida como mensagem, linha do erro, stacktrace e outros.

A linguagem Python, além das diversas exceções nativas, permite a criação de exceções customizadas com atributos e métodos próprios.

Como o bloco try pode conter várias declarações de código que podem gerar diferentes tipos de exceções. É possível capturar diferentes exceções sequencialmente. Isso é feito declarando um bloco except para cada tipo de possível exceção.

Sintaxe
try:
    #código
except nome_excecao1
    #tratamento
except nome_excecao2
    #tratamento
except nome_excecao3
    #tratamento
Exemplo 2
try:
    print(1/0)
    print(a)
except ZeroDivisionError: #divisão por 0
    print("Erro: ZeroDivisionError")
except NameError: # variável não declarada
    print("Erro: NameError")
Saída
Erro: ZeroDivisionError

Os blocos exception devem ser declarados a partir das exceptions menos genéricas até mais genéricas, para que a exception lançada no bloco try não seja capturada de forma errada.

Exemplo 3
try:
    print(1/0)
    print(a)
    #outra exception
except ZeroDivisionError: #divisão por 0
    print("Erro: ZeroDivisionError")
except NameError: # variável não declarada
    print("Erro: NameError")
except e:
    pass #exceção mais genérica
Saída
-

Quando precisamos executar algum tipo de tratamento independente se nossas declarações dentro do try, utilizamos o bloco finally.

Após a execução do try ou except, ocorrendo ou não uma exceção, o fluxo de execução é desviado para o bloco finally.

Sintaxe
try:
	#código
except nome_exception as nome_variavel:
	#tratamento
finally:
	#liberação de recursos

O bloco finally, normalmente, é utilizado para liberar recursos como alocação de memória, arquivos físicos e outros que são utilizados no bloco try.

Exemplo 5
try:
    print(a/0)
except ZeroDivisionError: #divisão por 0
    print("Erro: ZeroDivisionError")
except NameError as e: # variável não declarada
    print("Erro: NameError", e.__class__)
finally:
    print("Recursos liberados!")
Saída
Erro: NameError 
Recursos liberados!

Python possui o comando with que realiza implicitamente o gerenciamento de memória quando trabalhamos com arquivos, alocação de memória, conexões com banco de dados ou semelhantes.

Com o uso de with fica garantido que ao final de seu bloco de código, os recursos utilizados sejam liberados ao ocorrer um erro sem a necessidade do try-catch-finally.

Sintaxe
with declaracao as nome_variavel:
       #corpo
Onde
declaracao: função para abertura de arquivo, conexão ou outro.
Exemplo 6
with open("arq.txt") as arq:
    conteudo = arq.read()
    print(conteudo)  # Print file content
#recursos de memória e arquivo liberados
Saída
-

O bloco try-catch não deve ser codificado em todos os métodos de uma aplicação. Esse bloco deve ficar em pontos centrais para evitar excessos.

Exemplo 7
class Classe1:
    def metodo(self):  # pode ocorrer uma exceção
        print("metodo1")


class Classe2:
    def metodo(self):  # pode ocorrer uma exceção
        print("metodo2")


class Programa:
    def main(self):
        cls1 = Classe1()
        cls2 = Classe2()
        try:
            cls1.metodo()
            cls2.metodo()
        except Error:
            print("ocorreu um erro.")
        finally:
            pass

prg = Programa()
prg.main()
Saída
metodo1
metodo2

Caso um método, semelhante a Main que centraliza o tratamento de erros, mas que seja utilizado por outras classes. Esse método deve fazer o tratamento local nos blocos catch e finally e relançar o erro para o escopo em está sendo invocado.

O bloco try-catch não deve ser utilizar para tratamento de entrada de dados do usuário como campos vazios, valores com formato inválidos, por exemplo, que são condições normais de acontecer.

Exemplo 8: uso incorreto
class Classe1:
    codigo = None
    nome = None
    
class Programa:
    def main(self):
        cls1 = Classe1()

        try:
            #entrada do usuário omitida
            
            #validações comuns
            if cl1.codigo == None:
                pass #lançar exception
            
            if cl1.nome == None:
                pass #lançar exception
            
        except Exception:
            print("ocorreu um erro.")
        finally:
            pass

Não deixe blocos catch vazios, pois podem mascarar erros. Registre as informações do erro em logs ou ou relance a exceção.

  1. 12/09/2025 - revisão 3 - Ajustes: pontuais, target de links internos, sintaxes e objetivos; Adição: 'uso de try-catch'
  2. 09/06/2025 - revisão 2 - adição de comando with
  3. 18/09/2024 - revisão 1 - Ajustes gramaticais; outros ajustes
  4. 19/02/2024 - versão inicial