Em C++, lidar corretamente com erros é essencial para garantir a estabilidade e previsibilidade de um programa.
Dois mecanismos comuns usados para esse fim são std::runtime_error
, que faz parte do sistema de exceções da linguagem, e std::exit
, que encerra o processo imediatamente.
Embora ambos possam ser usados para sinalizar falhas, eles possuem propósitos completamente diferentes: um foca no tratamento e recuperação, o outro na finalização imediata.
Nesse artigo vamos ver o funcionamento de cada um, mostrar quando aplicá-los e discutir qual abordagem é mais adequada em diferentes contextos de desenvolvimento.
std::runtime_error
std::runtime_error
é uma exceção da biblioteca padrão C++ derivada de std::exception
.
Serve para sinalizar erros em tempo de execução que impedem a continuação normal do programa.
#include <stdexcept>
#include <iostream>
void carregarArquivo(const std::string& caminho) {
if (caminho.empty()) {
throw std::runtime_error("Caminho do arquivo inválido");
}
// ...
}
int main() {
try {
carregarArquivo("");
} catch (const std::runtime_error& e) {
std::cerr << "Erro: " << e.what() << '\n';
}
}
throw
e tratada com try/catch
.std::exit
std::exit
(definido em <cstdlib>
) termina o programa imediatamente, retornando um código de status ao sistema operacional.
#include <cstdlib>
#include <iostream>
int main() {
std::cerr << "Erro fatal, encerrando.\n";
std::exit(EXIT_FAILURE);
}
Situação | Recomendado | Motivo |
---|---|---|
Erro previsível ou recuperável | std::runtime_error |
Permite tratamento via try/catch e limpeza automática |
Erro irrecuperável (ex: corrupção de memória, falha grave de inicialização) | std::exit |
Finaliza de forma imediata e controlada |
Código de biblioteca ou engine | std::runtime_error |
Dá ao chamador a chance de reagir |
Programa pequeno ou utilitário simples | std::exit |
Simplicidade, sem necessidade de exceções |
std::runtime_error
quando quiser propagar e tratar erros dentro da lógica do programa.std::exit
apenas quando não há como continuar — o erro é fatal.std::runtime_error
é mais seguro e flexível, pois mantém o controle de fluxo e garante destruição adequada de recursos.Dependendo do contexto.
throw std::runtime_error(...)
Melhor na maioria dos casos.
try/catch
, stack unwinding, e destrutores são chamados corretamente (RAII).throw std::runtime_error("Arquivo inválido");
std::exit(1)
Use só se quiser encerrar IMEDIATAMENTE e não precisa liberar recursos.
main()
, ferramentas, ou se realmente precisa abortar sem exceções.std::cerr << "Erro fatal\n";
std::exit(1);
Situação | Melhor opção |
---|---|
Código com RAII/recursos alocados | throw std::runtime_error |
Em main() ou ferramenta simples |
std::exit(1) |
Precisa de tratamento de erro | throw |
Quer encerrar seco e rápido | std::exit(1) |
Recomendação padrão moderna: use throw
, não exit
, a menos que tenha motivo real.