Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
No desenvolvimento frontend, especialmente com TypeScript, lidar com funções assíncronas que podem lançar erros é uma tarefa que impacta diretamente na experiência do desenvolvedor e na estabilidade da aplicação. Diferente de linguagens como Java, onde a declaração de exceções é explícita na assinatura da função, TypeScript não possui um mecanismo nativo para forçar o tratamento de erros, o que pode gerar problemas de manejo de exceções não tratadas.
O TypeScript, por sua natureza, não permite especificar tipos de erro na assinatura de uma função como em Java. A única anotação que pode indicar que uma função é propensa a lançar uma exceção é o uso do tipo never, que informa ao compilador que a função sempre lança um erro e nunca retorna normalmente. Contudo, esse tipo não obriga o uso de try/catch na chamada, apenas serve como uma pista para o desenvolvedor, ou para ferramentas de análise de código. A decisão fica mais saudável quando o time consegue medir o impacto depois.
Um exemplo clássico é uma função que sempre lança uma exceção:
function falhaInevitável(): never {
throw new Error('Erro fatal'). } O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
falhaInevitável(). // Nenhum erro de compilação, mas o comportamento espera-se que sempre lance Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
Se a função pode retornar um valor ou lançar um erro, ela deve usar união de tipos, como Tipo | never. Ainda assim, o TypeScript não força o tratamento do erro, apenas informa que é uma possibilidade. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois.
Dado que o TypeScript não impõe o uso de try/catch, a abordagem mais comum e prática é estabelecer uma convenção de código e utilizar wrappers para facilitar o tratamento de erros. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
1. Utilizar funções que retornam objetos com status e dados: ao invés de lançar exceções, retornar objetos que indicam sucesso ou falha.
interface Resultado<T> {
sucesso: boolean. dado?: T. erro?: any. } Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
async function buscarDados(): Promise<Resultado<string>> {
try {
const resposta = await fetch('api/dados'). const dado = await resposta.text(). return { sucesso: true, dado }. } catch (e) {
return { sucesso: false, erro: e }. }
} O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois.
2. Utilizar utilitários de handling de erros: bibliotecas ou funções auxiliares que encapsulam a lógica de try/catch, promovendo uma abordagem mais uniforme.
async function safeExecute<T>(fn: () => Promise<T>): Promise<[Error | null, T | null]> {
try {
const dado = await fn(). return [null, dado]. } catch (e) {
return [e as Error, null]. }
} Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
const [err, data] = await safeExecute(() => fetch('api/dados').then(res => res.text())). if (err) {
// tratar erro
} Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
O maior desafio é que o TypeScript não impede que o desenvolvedor ignore o manejo de erros, o que pode levar a problemas na produção. Portanto, a cultura de código precisa reforçar o uso de padrões de tratamento e validação, além de ferramentas que auxiliem na detecção de chamadas não tratadas. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
Outra questão é o impacto na legibilidade e complexidade do código, já que muitas funções dependem de wrappers e padrões de retorno que podem parecer mais verbosos. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
No fim, entender que o TypeScript não obriga o tratamento de erros é fundamental. Assim, estabelecer boas práticas e automações é o caminho para evitar surpresas na produção, garantindo maior robustez na experiência do usuário. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois.
Carregando comentários...