Prevenir ou lidar com erros? LBYL x EAFP em Python

Stéfane Refrande
gb.tech
Published in
4 min readJul 11, 2022

Por mais que uma ação nossa envolva bastante planejamento e reflexão prévia, os erros e falhas serão inevitáveis em algum momento, em qualquer área da vida. Como bons seres humanos, tendemos naturalmente a pensar que “prevenir é melhor do que remediar” uma falha, já pensando que por instinto, não somos inclinados a lidar com erros ou caminhos fora do planejado.

Contudo, há contextos em que o custo para se lidar com as falhas são menores do que a elaboração de um esquema de prevenção, trazendo a questão: o que é melhor, prevenir ou lidar com os erros?

Blocos amarelos em um fundo rosa com letras que formam a palavra “error”

Em diferentes linguagens, esse dilema é discutido por dois estilos de programação, conhecidos pelas siglas LBYL (Look before you leap) e EAFP ( Easier to ask forgiveness than permission), ou “Olhar antes de pular” e “Mais fácil pedir perdão do que permissão”.

Ao lidar com erros e falhas, esses estilos lidam basicamente com dois caminhos diferentes:

  1. LBYL -> Prevenir erros e situações excepcionais de acontecerem
  2. EAFP -> Lidar com erros após eles já terem acontecido

Prevenindo Erros

Historicamente, a estratégia de prevenir os erros tem sido o caminho mais escolhido quando falamos de programação, principalmente pelo fato de que recursos sintáticos para lidar com exceções não existem desde sempre em diferentes linguagens, ou também porque em certas linguagens o processo de lidar com um erro após ele ocorrer torna-se mais custoso do que preveni-lo.

Na linguagem Python, essa prevenção é feita por meio da utilização de expressões condicionais, com ifs e elses que possuem a intenção de controlar os caminhos a serem percorridos antes de qualquer erro estourar.

Essa mentalidade parte do princípio de inserir pré condições possíveis para cada caso de erro — e o caminho para sua solução, caso ele ocorra (esses caminhos de solução irão existir antes mesmo da certeza se o erro ocorreu ou não!). O foco desse estilo é testar e ter a certeza de que determinado trecho de código irá funcionar mesmo antes de ele rodar.

Exemplo:

if idade.isnumeric():
idade_valida = int(idade)
else:
idade_valida = 30 #idade_default

Lidando com Erros

A sigla EAFP ou “Mais fácil pedir perdão do que permissão”, teve origem em uma fala de um oficial e cientista da computação estadunidense, Grace Hopper. Aqui podem ser encontradas outras falas conhecidas dele.

Essa mentalidade sugere que se vá direto ao ponto no objetivo a ser alcançado sem organizar o terreno para possíveis erros de início — afinal, se nada der errado, nenhuma energia extra precisaria ser gasta sem necessidade.

Esse estilo na linguagem Python é trabalhado com as exceções: try…except, recurso que permite tratar possíveis erros (conhecidos ou gerais), mas que só são tratados se os erros ocorrerem. Caso eles não ocorram, nem chegamos nesta parte do código, o que torna esse estilo mais eficiente e rápido, pois não passa pela checagem de pré condições a todo momento. Podemos notar que nesse estilo, tende-se a existir uma crença maior de que a operação ocorrerá com sucesso.

Exemplo:

try:
idade_valida = int(idade)
except ValueError:
idade_valida = 30 #idade_default
Fundo rosa com alguns fósforos em pé, com um fósforo no meio já queimado

LBYL x EAFP no mundo Python

Segundo o glossário Python, EAFP:

Easier to ask for forgiveness than permission. This common Python coding style assumes the existence of valid keys or attributes and catches exceptions if the assumption proves false. This clean and fast style is characterized by the presence of many try and except statements. The technique contrasts with the LBYL style common to many other languages such as C.

E LBYL:

Look before you leap. This coding style explicitly tests for pre-conditions before making calls or lookups. This style contrasts with the EAFP approach and is characterized by the presence of many if statements.

De forma geral, desenvolvedores Python tendem a preferir o estilo mais conservador, EAFP. Um dos fatores que mais influenciam esse comportamento, como mencionado anteriormente, é a herança da experiência com outras linguagens em que um estilo mais ousado é menos facilitado, seja por sintaxe ou performance.

Basicamente, a escolha de qual estilo seguir irá depender do que o contexto nos diz sobre as possibilidades de consequências dos acontecimentos esperados.

Uma pessoa que pratica patinação, por exemplo, pode optar por investir e se equipar com todo um equipamento de segurança, como joelheiras e capacete para prevenir machucados em casos de queda, ou pode sair patinando sem investir em nenhum equipamento, mas estar pronta para reagir caso algum acidente ocorra. A melhor escolha? Irá depender do contexto, do nível de aprendizado dessa pessoa patinadora, do local no qual irá patinar, e da sua disposição em aplicar mais energia na prevenção ou na reação.

Abaixo podemos observar, por fim, uma tabela comparativa de alguns aspectos de ambos estilos de se lidar com erros.

Tabela com dados comparativos resumidos entre ambos estilos de programação.

--

--