Clique sobre os tópicos listados abaixo para navegar até o conteúdo desejado.

  1. Exception
  2. Lançando uma exception
  3. Recuperar mensagem de erro
  4. Relançando uma exception
  5. Algumas exceptions nativas
  6. stacktrace

Uma exceção ou exception, é um evento ou acontecimento não desejado que pode ocorrer durante a execução de nossos programas, como erros de acesso a memória, falhas ao abrir um arquivo e outros. Quando uma exception ocorre, um objeto contendo suas informações é "lançado" para seu tratamento.

Exemplos de exceções
exception: exceção base de todas as exceções.
invalid_argument: argumento inválido.
out_of_range: acesso indevido a local de memória.

Para lançarmos uma exeption, de forma explícita, durante a a execução de nossos métodos, utilizamos o comando throw.

A linguagem C++ nos permite lançar exceções a partir de valores contidos em tipos básicos de de dados:

Sintaxe 1: throw com valor
throw valor_numerico;
throw string;
Sintaxe 2: throw com objeto
throw new Exception("minha mensagem de erro");
Exemplo 1
#include <iostream>
using namespace std;

int main()
{
    try
    {
       throw "Ocorreu um erro";
    }
    catch(const char *e)
    {
        cout << "Erro fatal:" << endl;
        cout << e << endl;
    }
    //outros blocos catch aqui

    return 0;
}
Saída
Erro fatal:
Ocorreu um erro
Exemplo 2
#include <iostream>
using namespace std;

int main()
{
    try
    {
       throw new Exception();
    }
    catch(const char *e){
        cout << "Erro fatal"
        cout << e << endl;
    }
    return 0;
}
Saída
Erros

Para recuperarmos a mensagem de erro contida em uma exception, utilizamos o métodos what que é herdado da classe Exception.

Sintaxe
public string what();
Exemplo 2
#include <iostream>
#include  //exceções padrão
using namespace std;
 
int main()
{
    try {
        throw invalid_argument("invalid_argument");
    }
    catch (const invalid_argument &a) {
        cout << "Erro:" << a.what() << endl;
    }
    return 0;
}
Saída
invalid_argument

O comando throw é utilizado tanto para lançar uma exceção quanto para relançar. Para relançar uma exceção, basta utilizar apenas o comando throw dentro de um bloco catch, como visto abaixo:

Sintaxe
catch(const tipo_excecao &variavel) 
{
    throw; //relançando exceção
}
Exemplo 4
#include <iostream>
#include <stdexcept>
using namespace std;

void funcao(int arg)
{
    try
    {
        throw invalid_argument("Erro invalid_argument");        
    }
    catch(const invalid_argument &e)
    {
        throw; //relançando erro
    }

}

int main()
{
    try 
    {
        funcao(1);
    }
    catch(const invalid_argument &ia)
    {
        cout << ia.what();
    }
    catch (...) //qualquer outro erro
    { 
        cout << "Ocorreu um erro";
    }
    return 0;
}
Saída
Erro invalid_argumento

Abaixo, uma lista de algumas exceções nativas mais comuns disponíveis na linguagem C++.

Tab. 1: Exceções nativas
Nome Descrição
exception Exceção base de todas as exceções
bad_allow lançada ao usar new
bad_cast Lançada ao usar dynamic_cast
bad_exception Exceção genérica
domain_error Lançada por cálculos matemáticos
invalid_argument Lançada ao existir argumentos em formatos inválidos
length_error Lançada quando algum recurso atinge o limite máximo
out_of_range Lançada quando há uma tentativa de leitura de um local de memória além do permitido
overflow_error Lançada quando ocorre um erro matemática de transbordamento
range_error Lançada quando há uma tentativa de escrita a local de memória além do permitido

Em futuras atualizações, as exceptions acima serão estudadas com exemplos para melhor compreensão de seus usos.

  1. 31/07/2025 - revisão 4 - Correções: pontuais, sintaxes; Alteração: 'Exceção genérica' movida. Adição: Ex. 1
  2. 27/09/2024 - revisão 2 - Correção em intro 'Exception'; ajustes pontuais
  3. 12/02/2024 - revisão 1 - correção em navegação, css e erros gramaticais
  4. 30/06/2023 - versão inicial