Médio JavaScript

Erro personalizado com finally

Enunciado

Crie uma classe SaldoInsuficienteError que estende Error. Implemente uma função sacar(saldo, valor) que lança esse erro se valor > saldo. Use try/catch/finally para exibir mensagens e garantir que uma mensagem de finalização sempre apareça.

Requisitos

  • SaldoInsuficienteError deve ter name = 'SaldoInsuficienteError' e mensagem personalizada.
  • A função sacar deve lançar SaldoInsuficienteError quando valor > saldo.
  • O catch deve verificar instanceof SaldoInsuficienteError e imprimir 'Erro: Saldo insuficiente'.
  • O finally deve imprimir 'Operação finalizada' independentemente do resultado.

Código inicial

class SaldoInsuficienteError extends Error {
  // seu código aqui
}

function sacar(saldo, valor) {
  // seu código aqui
}

try {
  // chame sacar com valores que gerem erro
} catch (erro) {
  // trate o erro
} finally {
  // mensagem final
}

Saída esperada

Erro: Saldo insuficiente
Operação finalizada
Ver dica

No construtor da subclasse, chame super(message) e defina this.name. Use instanceof no catch.

Mostrar solução
class SaldoInsuficienteError extends Error {
  constructor(message) {
    super(message);
    this.name = 'SaldoInsuficienteError';
  }
}

function sacar(saldo, valor) {
  if (valor > saldo) {
    throw new SaldoInsuficienteError('Saldo insuficiente para saque');
  }
  return saldo - valor;
}

try {
  const novoSaldo = sacar(100, 150);
  console.log('Novo saldo:', novoSaldo);
} catch (erro) {
  if (erro instanceof SaldoInsuficienteError) {
    console.log('Erro: Saldo insuficiente');
  } else {
    console.log('Erro inesperado:', erro.message);
  }
} finally {
  console.log('Operação finalizada');
}

Passo a passo

  1. Definimos a classe SaldoInsuficienteError que estende Error.
  2. No construtor, chamamos super(message) para inicializar a mensagem e definimos this.name para identificar o tipo.
  3. A função sacar verifica se o valor do saque é maior que o saldo.
  4. Se for, lança SaldoInsuficienteError com uma mensagem.
  5. No try, chamamos sacar(100, 150), que lança o erro.
  6. O catch captura e verifica se é uma instância de SaldoInsuficienteError usando instanceof.
  7. Se for, imprime a mensagem específica; caso contrário, trata como erro genérico.
  8. O bloco finally sempre executa, imprimindo a mensagem final.

Por que funciona

A herança de Error permite criar erros específicos e usar instanceof para diferenciá-los. O finally garante que código de limpeza ou finalização seja executado mesmo se ocorrer erro ou se um return for encontrado no try.

Erros comuns

  • Esquecer de chamar super(message) no construtor da subclasse: isso causa erro de referência.
  • Não definir this.name: o nome padrão será 'Error', dificultando a identificação.
  • Colocar código que pode falhar no finally: se o finally lançar erro, ele substitui o erro original.

Outra forma de resolver

Poderia usar erro.name === 'SaldoInsuficienteError' em vez de instanceof, mas instanceof é mais robusto com herança.

Saída esperada

Erro: Saldo insuficiente
Operação finalizada