Executando verificação de segurança...
1

como lhe dá com erros usando o Try/Catch

eu vivo com essa dúvida, e sempre me encontro em um beco sem saída.
eu ouço dos meus colegas de trabalho que o melhor é usar o console.log para debugar o erro, mas e em produção qual seria a melhor prática pra lhe dá com erros em chamadas de requisição de uma API por exemplo?
obs: a linguagem que eu trabalho é javascript/react

1

Geralmente eu uso o try{}catch(error){} pra personalizar retornos e impedir que um erro de código ou algo do tipo estoure na tela do usuário, algum erro do servidor, customo trabalhar com a seguinte premissa, de que, o catch é sempre uma saida para que não aparecça o erro e quebre toda a experiencia do usuário na hora que ele estiver navegando

pense na seguinte hipótese::

try{
    const response = await registrarUsuario(payloadToRegister);

    handleMessageResponse(response.body) // mensagem de sucesso para um tooltip ou simplemente ir para uma lista de usuário


}catch(err){
    //mas se algo acima falhar o seu código vai cair aqui ai pode escolher o que fazer, mandar o usuário pra outra tela, tratar os erros com mensagens personalizadas

redirecionar pra outra página ou em alguns casos dar até um console e verificar o erro (recomendo em desenvolvimento)
    
}

espero ter ajudado em algo

1

Eu não sei bem como está a cultura da linguagem até porque JS vive mudando de cultura, o que é esquisito, e um framework pod exigir você trabalhar mais com isso ou não. Por não estar treinado na tecnologia específica vou só dar uma resposta geral e deixar outros falarem do específico. Dentro do que eu conhecia ele não costumava ser muito usado.

Mas não vejo como o console.log() possa substituir um mecanismo tão mais complexo assim.

  • Se você pode evitar que um erro aconteça de forma correta, você deve evitar. Não use try-catch para controle de fluxo.
  • Se você precisa deixar que um erro ocorra para depois decidir o que fazer, talvez por uma condição de corida, então deve usá-lo. Se não tiver outro mecanismo mais adequado para fazer isso. Parece ser o caso da requisição de API, pelo menos costuma ser.
  • Não crie exceções para indicar regra de negócio, e aí não precisará capturar isso.
  • Se for erro de programação nunca deve capturar exceção. Deixe quebrar e corrija. Você pode ter uma exceção geral para lidar com isso só para quebrar de forma mais graciosa, mas não tente tratar isso.
  • Obviamente que só pode usar quando uma exceção é lançada. JS é pródiga em esconder muitos erros e dar um resultado ruim em vez de lançar uma exceção.
  • Se for a única forma de identificar o erro, então use. Confirme a documentação do que está usando.
  • Só capture o que você pode fazer algo útil naquela situação. Pode ser eventualmente apenas logar o erro e aprender uma mensagem graciosa, mas só se for que deve fazer mesmo.
  • Siga a cultura do lugar e a tecnologia que trabalha e mantenha a consistência.

Faz sentido para você?

Espero ter ajudado.


Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).

1

No entanto, dependendo da api, esse catch(err) ele não pega corretamente dependendo do erro de retorno da api.

Então sugiro você verificar bem os erros de retorno e tratar ele para que o catch possa pegar corretamente.

Este retorno abaixo é uma api onde efetuo reset de senha do usuário, não uso try/catch e sim envio o fetch para api e ele tem um retorno res.ok

const errorMessages: ErrorMessage = {
      'The provided current password is invalid':
        'A senha atual fornecida é inválida',
      'password must be at least 6 characters':
        'A senha deve ter pelo menos 6 caracteres',
      'Your new password must be different than your current password':
        'Sua nova senha deve ser diferente da sua senha atual.',
    }
    
    const res = await fetch(
      '/api/auth/reset-password',
      {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
          code,
          password,
          passwordConfirmation: confirmPassword,
        }),
      },
    )

   if (!res.ok) {
      const data = await res.json()
      const translatedMessage = errorMessages[data.error.message]
      return
    }
    
    startTransition(() => {
      router.push('/login')
    })

Como a api não retorna em portugues eu tenho essa validação trocando os texto em ingles pelos textos em portugues! Funciona bem aqui para min! Nesse caso o try/catch mas em outros lugares do meu sistema eu usei eles de boa!

Já em outro lugar no site eu uso try/catch e funciona numa boa, desde que eu configure para ele exibir a mensagem para usuário que ouve algum problema!

    try {
      const { jwt, user } = await loginUser({identifier, password})
      const userId = user?.id.toString()
      document.cookie = cookie.serialize('jwt', jwt, {
        path: '/',
        maxAge: 30 * 24 * 60 * 60,
      }) // Set the cookie to expire in 30 days
      setSuccessMessage('Login bem-sucedido! Redirecionando...')
      setTimeout(() => {
        router.push('/academy/dashboard/')
      }, 100)
     } catch (err) {
      console.log(err)
      if (err instanceof Error) {
        setError(err.message)
      } else {
        setError('An unknown error occurred')
      }
    }