
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_errorstd::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::exitstd::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.