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

  1. Exception customizada
  2. Adicionando atributos e métodos
  3. Lançando/Relançando
  4. Uso de exception

Para a declaração de nossas próprias exceções customizadas precisamos, inicialmente criar uma classe que irá representar nossa exceção e fazer com que essa herde a classe Exception ou outra. Assim, temos acessos aos seus atributos e métodos:

Sintaxe 1
modificador_acesso class minha_excecao extends <excecao_base>
{
   //corpo
}
Onde
excesao_base: classe Exception ou filha

No construtor de nossa exceção customizada, utilizamos um parâmetro para receber uma mensagem informativa do erro e chamamos o construtor da classe herdada por intermédio da palavra reservada parent.

Sintaxe 2
modificador_acesso class minha_excecao extends <excecao_base>
{
    function __construtor($msg, $cod)
    {
        parent::__construct($msg, $cod);
    }
}
Onde
excesao_base: classe Exception ou filha
$msg: mensagem de erro
$cod: código do erro

Quando herdamos a classe Exception, podemos fazer uso de seus métodos mostrados \ na tabela abaixo:

Tab 1.: Métodos
Método Descrição
getMessage(): string Retorno a mensagem de erro
getPrevious(): ?Throwable Retorno a exception mais interna
getCode(): int Retorna o código do erro
getFile(): string Retorna o nome do arquivo
getLine(): int Retorna a linha do arquivo onde ocorreu a exceção
getTrace(): array Retorna stack trace
getTraceAsString(): string Retorna stack trace como string
Exemplo 1
<?php
class MinhaException extends Exception
{
	function __construct($msg, $cod)
    {
		parent::__construct($msg,$cod);
	}
}
Saída
-

Para lançar e relançar exceções customizadas é feita da mesma forma que outras exceções vista em Gerenciando Erros: Exception.

As exceções customizadas aceitam métodos e atributos assim como qualquer outra classe criada até o momento. Tudo estudado sobre herança em POO: Herança é aplicável.

Exemplo 2
<?php
class Excecao extends Exception{
	private $meuCodigoErro;
	private $minhaMensagem;

	function __construct($msg, $cod){
		parent::__construct($msg,$cod);
		$this->$meuCodigoErro = $cod;
		$this->$minhaMensagem = $msg;
	}
	
	function exibirMinhaMensagem(){
		return "mensagem: \"$this->$minhaMensagem\" código: $this->$meuCodigoErro";
	}
}
Saída
-

Não há diferença ao lançar ou relançar um exception customiza, exceto pelos atributos extras adicionados. O uso do comando throw é feito como já visto em outros exemplos.

Exemplo 2
<?php
class Excecao extends Exception{
	private $meuCodigoErro;
	private $minhaMensagem;

	function __construct($msg, $cod){
		parent::__construct($msg,$cod);
		$this->$meuCodigoErro = $cod;
		$this->$minhaMensagem = $msg;
	}
	
	function exibirMinhaMensagem(){
		return "mensagem: \"$this->$minhaMensagem\" código: $this->$meuCodigoErro";
	}
}

function funcao1(){
	throw new Excecao("um erro qualquer",777);
}
try{
	funcao1();
}
catch(Excecao $ex){
	echo "exibirMessage: ",$ex->exibirMinhaMensagem(),"\n";
	echo "getMessage: ",$ex->getMessage(),"\n";
	echo "getCode: ",$ex->getCode(),"\n";
	echo "getFile: ",$ex->getFile(),"\n";
	echo "getLine: ",$ex->getLine(),"\n";
}
Saída
exibirMessage: mensagem: "um erro qualquer" código: 777
getMessage: um erro qualquer
getCode: 777
getFile: /home/user/scripts/code.php
getLine: 17
  1. 22/08/2025 - revisão 3 - Ajustes: pontuais e sintaxes; Adição: lançando e relançando
  2. 20/09/2024 - revisão 3 - Adição de blocos 'Onde'; outros Ajustes pontuais
  3. 03/09/2024 - revisão 2 - Correção em link de objetivo: Adicionar atributos e métodos
  4. 06/02/2024 - revisão 1 - correção em navegação e erros gramaticais
  5. 04/09/2023 - versão inicial