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
yfor zero, a função divide lança uma exceção do tipoconst 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.
