Tratamento de exceções

O tratamento de exceções é um mecanismo fundamental em C++ para lidar com erros e situações inesperadas durante a execução do programa, tornando o código mais robusto e seguro.

Palavras-chave principais

  • try: bloco onde o código que pode gerar uma exceção é colocado.
  • throw: comando usado para lançar uma exceção.
  • catch: bloco que captura e trata a exceção lançada.

Sintaxe

try {
// Código que pode gerar uma exceção
} catch (TipoDaExcecao variavel) {
// Código para tratar a exceção
}
  • O bloco try envolve o código potencialmente problemático.
  • Se ocorrer um erro, throw lança uma exceção, que pode ser de qualquer tipo (int, string, objeto, etc.).
  • O bloco catch captura a exceção e executa o tratamento adequado.

Exemplo Prático: Divisão por Zero

#include <iostream>
using namespace std;

float divide(float x, float y) {
if (y == 0) {
throw "Erro: divisão por zero!";
}
return x / y;
}

int main() {
float a, b;
cout << "Digite dois números: ";
cin >> a >> b;
try {
cout << "Resultado: " << divide(a, b) << endl;
} catch (const char* msg) {
cout << msg << endl;
}
return 0;
}

Neste exemplo:

  • Se y for zero, a função divide lança uma exceção do tipo const char*.
  • O bloco catch captura a exceção e exibe uma mensagem informativa.

Múltiplos Blocos catch

É possível capturar diferentes tipos de exceções usando múltiplos blocos catch:

try {
// código
} catch (int erro) {
cout << "Erro inteiro: " << erro << endl;
} catch (const char* msg) {
cout << "Mensagem de erro: " << msg << endl;
}

Cada bloco catch trata um tipo específico de exceção.

Exceções Personalizadas

Pode criar as suas próprias classes de exceção para tornar o tratamento mais descritivo:

#include <iostream>
#include <exception>
using namespace std;

class MinhaExcecao : public exception {
public:
const char* what() const noexcept override {
return "Ocorreu uma exceção personalizada!";
}
};

int main() {
try {
throw MinhaExcecao();
} catch (const MinhaExcecao& e) {
cout << e.what() << endl;
}
return 0;
}

Utilizando classes derivadas de std::exception, é possível fornecer mensagens detalhadas e padronizadas.

Dicas e Boas Práticas

  • Sempre que possível, use tipos de exceção informativos (como classes ou strings) em vez de inteiros.
  • Evite capturar exceções genéricas (catch (...)) sem necessidade, pois dificulta o diagnóstico do erro.
  • Use exceções para situações excecionais, não para controle de fluxo normal do programa.
  • Exceções não tratadas encerram o programa imediatamente.

Resumo

O tratamento de exceções em C++ é feito com os blocos try, throw e catch. Ele permite separar a lógica normal do tratamento de erros, facilitando a manutenção e aumentando a robustez do código.