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

  1. Criando exception customizada sem herança
  2. Criando 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 foi estudado 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 contendo 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 informando que vamos herdar de um classe de exceção específica:

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

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

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. 31/07/2025 - revisão 4 - Correções: pontuais, sintaxes; Adição: Ex. 2, 3 e 5
  2. 27/09/2024 - revisão 3 - Correção: intro 'Exception','Exceção usando herança' e 'Exception sem herança';
  3. 30/08/2024 - revisão 2 - Correção em links de objetivos
  4. 12/02/2024 - revisão 1 - correção em navegação, css e erros gramaticais
  5. 30/06/2023 - versão inicial