paint-brush
A verdadeira importância das exceções: tratamento de erros em PHP vs. Golangpor@shcherbanich
8,399 leituras
8,399 leituras

A verdadeira importância das exceções: tratamento de erros em PHP vs. Golang

por Filipp Shcherbanich7m2023/10/20
Read on Terminal Reader
Read this story w/o Javascript

Muito longo; Para ler

Olhando para trás, a maneira como lidamos com os erros mostra como as necessidades e os desafios dos desenvolvedores mudaram ao longo do tempo.
featured image - A verdadeira importância das exceções: tratamento de erros em PHP vs. Golang
Filipp Shcherbanich HackerNoon profile picture

Recentemente, tive uma conversa fascinante com um amigo que, assim como eu, é desenvolvedor de software. Estávamos discutindo como diferentes linguagens de programação lidam com erros e isso gerou algumas divergências. Ficamos nos perguntando quais métodos de tratamento de erros funcionam melhor, quais são os prós e os contras e até mesmo se poderíamos viver sem exceções. Essa conversa despertou minha curiosidade em explorar mais profundamente o tratamento de erros em várias linguagens de programação e agora estou animado para compartilhar o que aprendi.


No meu trabalho diário, uso PHP e Golang — duas linguagens com abordagens distintas para tratamento de erros. Neste artigo, quero levá-lo em uma jornada onde compararemos como essas linguagens lidam com erros. Mas há mais para descobrir! Também exploraremos métodos alternativos de tratamento de erros e descobriremos quais são mais adequados para diferentes tarefas. Portanto, prepare-se para uma exploração envolvente do tratamento de erros no mundo da codificação.

Métodos de tratamento de erros: um mergulho em PHP e Golang

O tratamento de erros na programação é muito importante. Olhando para trás, a maneira como lidamos com os erros mostra como as necessidades e os desafios dos desenvolvedores mudaram ao longo do tempo.


Inicialmente, os retornos de códigos de erro eram dominantes. Esses retornos simples, geralmente baseados em números inteiros, indicavam sucesso ou tipos de erros específicos. Embora fossem eficientes, a desvantagem era que muitas vezes confundiam o código e o tornavam menos legível. Para decifrar um erro, era necessário consultar constantemente a documentação ou as definições de código de erro.


As exceções surgiram como uma solução mais intuitiva: em vez de retornar um código, o programa lançaria uma exceção sempre que ocorresse um erro, permitindo ao desenvolvedor detectá-lo em uma parte designada do código. Essa abordagem foi adotada por sua clareza e capacidade de centralizar o tratamento de erros.


Logo depois, os retornos de chamada de erro ganharam espaço, especialmente em ambientes assíncronos. A ideia era simples: em vez de esperar por um erro, por que não passar uma função (um retorno de chamada) para tratá-lo? O padrão onError(callback) tornou-se popular em JavaScript, tornando o tratamento de erros mais proativo.


Algumas linguagens de programação introduziram funções especiais que permitem trabalhar com erros e exceções. Por exemplo, em LUA, existem error() e pcall() . Eles ofereciam uma combinação de códigos de erro tradicionais e mecanismos de exceção.


Paralelamente aos métodos de trabalho com erros descritos anteriormente, um conceito como mônadas apareceu nas linguagens de programação funcional. Eles envolvem um valor em um contexto que indica sucesso ou falha, permitindo um tratamento de erros mais expressivo e seguro. Fora isso, eles podem ser usados com vários outros padrões funcionais, permitindo um tratamento de erros e encadeamento de operações poderoso e conciso.


Mas vamos mudar nosso foco para PHP e Golang. PHP possui amplos recursos de tratamento de erros. Antes da versão 5.0, não havia nenhuma exceção nesta linguagem de programação. Os desenvolvedores usaram uma ampla variedade de métodos de tratamento de erros, como a função trigger_error , que gera uma mensagem de erro/aviso/aviso no nível do usuário; a função set_error_handler , que permite definir um retorno de chamada para tratamento de erros no script, retornando ativamente 'false' ou 'null' como resultado de execução malsucedida da função, etc.


Muitos desses métodos ainda são amplamente utilizados no código PHP. Ainda assim, com o advento das exceções e das construções de linguagem para tratá-las, elas ganharam grande popularidade entre os desenvolvedores, pois ofereciam uma série de vantagens sobre os métodos tradicionais de tratamento de erros, por exemplo, informações mais detalhadas sobre o erro e onde ele ocorreu, o capacidade de lidar com erros de maneira estruturada e melhor legibilidade de códigos complexos.


Golang, por outro lado, lida com um padrão de retorno múltiplo onde as funções retornam um resultado e um erro, enfatizando a verificação explícita de erros em vez do tratamento implícito de exceções. Os criadores do Golang seguem o princípio de que a linguagem de programação deve ser o mais clara e simples possível. O principal objetivo de seu design foi fornecer construções de linguagem claras e eficientes para escrever código, especialmente em grandes organizações como o Google. Dessa forma, os desenvolvedores poderiam se concentrar na solução de problemas sem perder tempo discutindo sobre o estilo do código ou tentando entender códigos complexos e confusos.

Tratamento de erros em PHP e Golang: uma comparação de legibilidade

Abordagem de exceção do PHP

Conforme observado anteriormente, o PHP possui muitos recursos de tratamento de erros, mas as exceções são o método mais popular atualmente. Embora esta abordagem seja intuitiva e espelhe muitas outras linguagens de programação, ela pode levar a estruturas aninhadas, a situação quando se está lidando com múltiplas fontes potenciais de erros. Esse aninhamento “try-catch” pode dificultar a leitura do código, especialmente para iniciantes. Vamos decompô-lo.

VANTAGENS:

  • Brevidade . O tratamento de exceções do PHP pode resultar em código conciso, reduzindo o número total de linhas necessárias. Isto é particularmente benéfico ao lidar com vários tipos de erros em um segmento de código. Ele fornece um mecanismo centralizado de tratamento de erros.
  • Universalidade. Sendo semelhante a muitas outras linguagens, o mecanismo de exceção do PHP é familiar para muitos desenvolvedores e facilita a transição de outras origens de codificação para o PHP. A linguagem de programação mais popular do momento possui essa forma de lidar com erros.

DESVANTAGENS:

  • Interrupção de fluxo. A principal deficiência é o potencial de obscurecer o fluxo lógico do código. À medida que as exceções se propagam, pode ser um desafio rastrear a origem do erro original, o que complica a depuração.
  • Excesso de confiança. Depender demais de exceções também pode levar ao uso excessivo, onde erros triviais são lançados como exceções, o que por sua vez complica o código desnecessariamente.

Tratamento de erros explícitos de Golang

Golang adota uma abordagem distinta. Em vez de exceções, as funções retornam um valor de erro junto com seu valor de retorno regular. É então responsabilidade do desenvolvedor verificar e tratar esse erro. Embora isso possa tornar o código Go mais demorado, oferece uma compreensão clara de quando e onde erros podem ocorrer.


VANTAGENS:

  • Simplicidade do fluxo de controle. Como Go não usa exceções para tratamento de erros, não há necessidade de blocos “try-catch” — isso reduz a complexidade do fluxo de controle.
  • Flexibilidade . A abordagem de Golang permite que os desenvolvedores decidam como lidar com cada erro caso a caso, seja propagando-o, registrando-o ou tomando medidas corretivas. Esse controle pode levar a aplicações mais robustas.

DESVANTAGENS:

  • Longitude. Uma das críticas mais comuns é que o tratamento de erros do Go pode levar a um código detalhado. As funções que podem falhar devem retornar um valor de erro adicional, e o tratamento desses erros muitas vezes pode resultar em um padrão repetitivo de verificação de erros.
  • Potencial para supervisão. Como o tratamento de erros é explícito, pode haver o risco de os desenvolvedores esquecerem ou optarem intencionalmente por não verificar um erro.
  • Falta de contexto . Embora o tipo de erro padrão do Go seja simples e consistente, muitas vezes faltam informações contextuais sobre onde e por que o erro ocorreu. Embora existam pacotes e padrões para adicionar mais contexto, eles não são tão integrados quanto alguns desenvolvedores gostariam.

Diferenças no desempenho e consumo de recursos

O debate entre PHP e Golang frequentemente se aventura em vários domínios da programação, mas uma das áreas de discórdia mais significativas é a diferença no desempenho e no consumo de recursos, especialmente quando se trata de tratamento de erros.


No caso do PHP, as exceções permitem a criação de um stack trace, que auxilia no rastreamento da sequência de chamadas que levam ao erro. Esse rastreamento fornece informações valiosas para depuração. Porém, gerar tal traço, especialmente em aplicações complexas, demanda recursos computacionais e memória. Conseqüentemente, quando exceções são lançadas com frequência, elas podem tornar o aplicativo mais lento e aumentar o consumo de recursos.


Por outro lado, o método de Golang evita a sobrecarga da criação do rastreamento de pilha de exceções. Em vez disso, as funções retornam valores de erro que devem ser verificados explicitamente pelo programador. Essa abordagem resulta em desempenho mais enxuto e consumo reduzido de recursos. Mas isso transfere a responsabilidade diretamente para os ombros do desenvolvedor, que também consome muitos recursos de alguma forma.


A decisão entre usar o método baseado em exceções do PHP ou o tratamento explícito de erros do Golang não é apenas uma questão de desempenho e recursos, mas sim de compensações. As exceções fornecem muitas informações de depuração, mas têm um custo; A abordagem de Golang, por sua vez, é amigável em termos de recursos, mas requer diligência na gestão de erros.

Conclusão: é possível e necessário viver sem exceções?

O PHP, nascido das necessidades de desenvolvimento web, priorizou a simplicidade e a hospedagem compartilhada. Seu tratamento de erros o torna amigável ao desenvolvedor para aplicativos da web. Por outro lado, Golang, criado pelos gigantes do software Google, foi projetado para programação de sistemas modernos. Ele enfatiza o tratamento explícito de erros usando múltiplos valores de retorno: esse paradigma promove um fluxo de código mais claro e transforma erros em valores regulares, oferecendo um controle mais preciso.


Diferentes origens e objetivos moldaram suas filosofias de tratamento de erros. O PHP visava ampla adoção entre desenvolvedores web, valorizando acessibilidade e leniência. Em contraste, Golang buscou desempenho, clareza e robustez, ideais para sistemas escaláveis e de fácil manutenção.


As suas abordagens inevitavelmente suscitam o debate sobre a necessidade de excepções.


Embora a codificação sem exceções possa parecer assustadora, ela leva os desenvolvedores a um código mais transparente e previsível. No entanto, pode não ser universalmente adequado e destaca a necessidade de compreender intenções e aplicações específicas da linguagem.


Quanto a mim, apesar das possíveis desvantagens das exceções, sou um daqueles desenvolvedores que prefere utilizá-las em seu trabalho, se isso for possível. A abordagem Golang me parece menos confortável, mas também me obriga a pensar mais sobre o que estou fazendo e o que quero alcançar. Qual método você gosta mais de usar? Ficarei feliz se você compartilhar essas informações nos comentários!