0Pricing
Python Academy · Aula

Geração e repropagação de exceções

Use raise para sinalizar erros e repropague-os para que sejam encaminhados.

Geração e repropagação de exceções é uma aula grátis de Python Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Python Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Python Academy inclui 4 aulas no total.

Introdução

A palavra-chave raise permite sinalizar erros explicitamente. Gerar novamente uma exceção preserva o contexto do erro original.

Gerando uma exceção integrada

raise ValueError('message') gera imediatamente esse tipo de exceção com a mensagem fornecida.
def divide(a, b):
    if b == 0:
        raise ValueError('Denominator cannot be zero')
    return a / b
try:
    divide(5, 0)
except ValueError as e:
    print(e)

Gerando novamente a mesma exceção

Dentro de except, raise (sem argumento) gera novamente a exceção atual, preservando o rastreamento de execução original.
def process(data):
    try:
        return int(data)
    except ValueError:
        print('logging error')
        raise  # re-raises original
try:
    process('abc')
except ValueError:
    print('caller caught it')

Encadeando exceções com from

raise NewError('msg') from original encadeia as exceções. exc.__cause__ é definido.
try:
    int('abc')
except ValueError as original:
    raise RuntimeError('processing failed') from original

Suprimindo o encadeamento

raise NewError() from None interrompe o encadeamento — a exceção original é suprimida no rastreamento de execução.
try:
    int('abc')
except ValueError:
    raise RuntimeError('clean error') from None

Instrução assert

assert condition, 'message' gera AssertionError se condition for False. Use-a somente para invariantes durante o desenvolvimento.
def sqrt(x):
    assert x >= 0, f'Input must be non-negative, got {x}'
    return x ** 0.5
try:
    sqrt(-1)
except AssertionError as e:
    print(e)

Geração condicional

Cláusulas de guarda com raise no início de uma função tornam as pré-condições explícitas e evitam aninhamentos profundos.
def process(items):
    if not items:
        raise ValueError('items must not be empty')
    return items[0]
print(process([1, 2, 3]))

Gerar novamente ou gerar uma nova exceção

Gerar novamente a exceção (raise sem tipo) preserva o contexto. Uma nova exceção o oculta. Use o encadeamento para manter ambos visíveis.
def outer():
    try:
        inner()
    except ValueError as e:
        raise RuntimeError('outer failed') from e
def inner():
    raise ValueError('inner failed')
try:
    outer()
except RuntimeError as e:
    print(e, e.__cause__)

Exceção em finally

Gerar uma exceção em finally substitui a exceção original. Evite gerar exceções em finally, a menos que seja absolutamente necessário.
try:
    try:
        raise ValueError('original')
    finally:
        print('finally ran')
except ValueError as e:
    print('caught:', e)

warnings.warn versus raise

Use warn() para erros não críticos e recuperáveis; use raise para erros que precisam ser tratados. Eles têm finalidades diferentes.
import warnings
def old_func():
    warnings.warn('Deprecated', DeprecationWarning)
    return 42
print(old_func())

Padrão raise from None

Ao transformar exceções de bibliotecas em exceções da sua própria API, use from None para evitar o vazamento de detalhes internos.
class DBError(Exception): pass
def query(q):
    try:
        raise ConnectionError('refused')
    except ConnectionError:
        raise DBError('query failed') from None
try:
    query('SELECT 1')
except DBError as e:
    print(e)

Verificação rápida

O que raise (sem argumento) faz dentro de um bloco except?

Recapitulação

raise Type('msg') sinaliza erros. raise sem tipo gera novamente a exceção. raise New from Old encadeia exceções. raise New from None suprime o contexto. Use assert para invariantes durante o desenvolvimento.

Continue avançando

Excelente trabalho! Passe à próxima lição para continuar avançando.

Perguntas Frequentes

A aula “Geração e repropagação de exceções” é grátis?

Sim — o texto completo de “Geração e repropagação de exceções” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Python Academy, atualize para CoddyKit PRO. O curso de Python Academy inclui 4 aulas no total.

O que vou aprender em “Geração e repropagação de exceções”?

Use raise para sinalizar erros e repropague-os para que sejam encaminhados. Você pratica Python Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Python Academy?

Nenhuma experiência prévia é necessária. Python Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “Geração e repropagação de exceções”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Python Academy?

Sim. Cada aula de Python Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Entendendo as exceções
  2. try / except / else / finally
  3. Geração e repropagação de exceções
  4. Classes de exceção personalizadas
← Voltar para Python Academy