AnyCompiler

Exceptions e Tratamento de Erros

Uma function que encontra um erro que não consegue tratar localmente pode lançar uma exception — a execução imediatamente desenrola a call stack até encontrar um catch block que corresponda. Um throw sem nenhum catch correspondente em lugar nenhum termina o programa.

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

double divide(double a, double b) {
    if (b == 0) {
        throw runtime_error("cannot divide by zero");
    }
    return a / b;
}

int main() {
    try {
        cout << divide(10, 2) << endl;
        cout << divide(10, 0) << endl;
    } catch (const runtime_error& e) {
        cout << "Error: " << e.what() << endl;
    }
    return 0;
}
Output
5
Error: cannot divide by zero

Note que divide(10, 2) imprime seu resultado normalmente, mas divide(10, 0) lança antes de poder retornar — a execução pula direto para o catch block, pulando completamente o resto do try block. Enquanto a stack se desenrola passando por quaisquer objects RAII no caminho, seus destructors ainda rodam normalmente, então os recursos são limpos mesmo quando uma exception corta uma function pela metade.

Essa é a base do C++: references e pointers para acesso flexível sem sempre copiar, RAII para limpeza determinística de recursos sem coletor de lixo, classes com virtual dispatch para polymorphism, e templates para código genérico em tempo de compilação. A partir daqui, o melhor próximo passo é praticar — escolha um programa pequeno e o construa, prestando muita atenção a quem possui cada recurso e quando ele é limpo.

Practice exercise

Escreva uma function safeDivide(double a, double b) que lance um runtime_error("cannot divide by zero") se b for 0, senão retorne a / b. Chame-a com (10, 0) dentro de um try/catch, e imprima a mensagem da exception capturada.

← Smart PointersMais lições em breve