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

  1. Exception customizada sem herança
  2. Exception customizada com herança

As exception customizadas são exceções criadas para atender as necessidades de nossas aplicações em relação ao possíveis erros ocorridos. Utilizando herança, podemos estender exceptions nativas com novos atributos e métodos.

Para criarmos uma exceção própria é necessário ter conhecimento sobre O.O que foi visto em C++: POO e precisamos também incluir as bibliotecas nativas abaixo:

Sintaxe
#include <exception>
#include <stdexcept>

Criando uma classe concreta e sem herança, podemos utilizá-la como exceção com o comando throw e também no bloco catch.

Sintaxe A
class minha_excecao
{
    //corpo omitido
}
Onde
-
Exemplo 1
#include <iostream>
#include <exception>
#include <stdexcept>

using namespace std;

class minha_excecao { //sem mensagem de erro customizada
};   

int main()
{
    try 
    {
        throw minha_excecao(); //lançando exceção
    }
    catch(minha_excecao me){
       cout << "Ocorreu um erro" << endl;
    }

    return 0;
}
Saída
Ocorreu um erro

A adição de métodos, atributos e construtores em nossas exceções customizadas é feita da mesma forma vista em C++: POO.

Exemplo 2
using namespace std;

class minha_excecao {
    private: 
            string msg;
            int id;
    
    public: 
    
    string mensagem()
    {
          //omitido     
    }
};

Após a declaração dos atributos e métodos necessários, declaramos um método construtor que irá auxiliar a iniciar um objeto do tipo de nossa exceção.

Exemplo 3
class minha_excecao {
    
    //atributos e métodos omitidos
    
    minha_excecao(string _msg, int _id){
        this->msg = _msg;
        this->id = _id;
    }
};

Abaixo, o exemplo final contém os trechos de código acima mostrados:

Exemplo 4
#include <iostream>
#include <exception>
#include <stdexcept>

using namespace std;

class minha_excecao {
    private: 
            string msg;
            int id;
    
    public: 
    
    string mensagem(){
        return to_string(id) + "\n" + msg ;
    }
    
    minha_excecao(string _msg, int _id){
        this->msg = _msg;
        this->id = _id;
    }
};   

int main()
{
    try 
    {
        throw minha_excecao("meu erro customizado",777);
    }
    catch(minha_excecao me)
    {
       cout << me.mensagem() << endl;
    }

    return 0;
}
Saída
777
meu erro customizado

Para criarmos exceções customizadas herdando de exceções já existentes, precisamos declarar nossa classe de exception customizada informando que vamos herdar de uma classe de exceção nativa ou do usuário:

Sintaxe
class minha_excecao : public exception_base
{
    //corpo
};
Exemplo 5
class minha_excecao : public exception 
{
    //corpo omitido
};

Em seguida, precisamos sobreescrever o método what de acordo com as necessidades da exibição de nosso erro customizado fazendo uso de seus atributos e retornar uma string de erro:

Sintaxe
class minha_excecao : public excecao_base
{
    //trecho omitido

    const char* what() const throw()
    {
        //corpo 
    }
}
Exemplo 6
#include <iostream>
#include <exception>
using namespace std;

class minha_excecao : public exception {
  private:
  string msg;
  
  public:  
  minha_excecao(string _msg){
    this->msg = _msg;    
  }
  
  const char* what() const throw() 
  { 
    return msg.c_str(); //retorna tipo char* 
  }
};   

int main()
{
    try 
    {
        throw minha_excecao("meu erro customizado");
    }
    catch(minha_excecao me){
       cout << me.what() << endl;
    }
    return 0;
}
Saída
meu erro customizado
  1. 15/07/2026 - revisão 5 - Ajustes: objetivos e títulos; outros ajustes pontuais
  2. 31/07/2025 - revisão 4 - Correções: pontuais, sintaxes; Adição: Ex. 2, 3 e 5
  3. 27/09/2024 - revisão 3 - Correção: intro 'Exception','Exceção usando herança' e 'Exception sem herança';
  4. 30/08/2024 - revisão 2 - Correção em links de objetivos
  5. 12/02/2024 - revisão 1 - correção em navegação, css e erros gramaticais
  6. 30/06/2023 - versão inicial