Exceções do PHP
O que é uma exceção?
Uma exceção é um objeto que descreve um erro ou comportamento inesperado de um script PHP.
Exceções são lançadas por muitas funções e classes PHP.
Funções e classes definidas pelo usuário também podem lançar exceções.
As exceções são uma boa maneira de interromper uma função quando ela encontra dados que ela não pode usar.
Lançando uma exceção
A throw
instrução permite que uma função ou método definido pelo usuário lance uma exceção. Quando uma exceção é lançada, o código que a segue não será executado.
Se uma exceção não for capturada, ocorrerá um erro fatal com uma mensagem "Exceção não capturada".
Vamos tentar lançar uma exceção sem pegá-la:
Exemplo
<?php
function divide($dividend, $divisor) {
if($divisor == 0)
{
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
echo divide(5, 0);
?>
O resultado será algo assim:
Fatal error: Uncaught Exception: Division by zero in
C:\webfolder\test.php:4
Stack trace: #0 C:\webfolder\test.php(9):
divide(5, 0) #1 {main} thrown in C:\webfolder\test.php on line 4
A declaração try...catch
Para evitar o erro do exemplo acima, podemos usar a
try...catch
instrução para capturar exceções e continuar o processo.
Sintaxe
try {
code that can throw exceptions
} catch(Exception $e) {
code that runs when an exception is caught
}
Exemplo
Mostrar uma mensagem quando uma exceção é lançada:
<?php
function divide($dividend, $divisor) {
if($divisor ==
0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
try {
echo
divide(5, 0);
} catch(Exception $e) {
echo "Unable to divide.";
}
?>
O bloco catch indica que tipo de exceção deve ser capturada e o nome da variável que pode ser usada para acessar a exceção. No exemplo acima, o tipo de exceção é Exception
e o nome da variável é $e
.
A declaração try... catch...finally
A try...catch...finally
instrução pode ser usada para capturar exceções. O código no
finally
bloco sempre será executado independentemente de uma exceção ter sido capturada. Se
finally
estiver presente, o catch
bloco é opcional.
Sintaxe
try {
code that can throw exceptions
} catch(Exception $e) {
code that runs when an exception is caught
} finally {
code that
always runs regardless of whether an exception was caught
}
Exemplo
Mostre uma mensagem quando uma exceção for lançada e indique que o processo terminou:
<?php
function divide($dividend, $divisor) {
if($divisor
== 0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
try {
echo
divide(5, 0);
} catch(Exception $e) {
echo "Unable to
divide. ";
} finally {
echo "Process complete.";
}
?>
Exemplo
Emita uma string mesmo que uma exceção não tenha sido capturada:
<?php
function divide($dividend, $divisor) {
if($divisor == 0)
{
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} finally {
echo
"Process complete.";
}
?>
O objeto de exceção
O objeto de exceção contém informações sobre o erro ou comportamento inesperado que a função encontrou.
Sintaxe
new Exception(message, code, previous)
Valores de parâmetro
Parameter | Description |
---|---|
message | Optional. A string describing why the exception was thrown |
code | Optional. An integer that can be used used to easily distinguish this exception from others of the same type |
previous | Optional. If this exception was thrown in a catch block of another exception, it is recommended to pass that exception into this parameter |
Métodos
Ao capturar uma exceção, a tabela a seguir mostra alguns dos métodos que podem ser usados para obter informações sobre a exceção:
Method | Description |
---|---|
getMessage() | Returns a string describing why the exception was thrown |
getPrevious() | If this exception was triggered by another one, this method returns the previous exception. If not, then it returns null |
getCode() | Returns the exception code |
getFile() | Returns the full path of the file in which the exception was thrown |
getLine() | Returns the line number of the line of code which threw the exception |
Exemplo
Informações de saída sobre uma exceção que foi lançada:
<?php
function divide($dividend, $divisor) {
if($divisor == 0)
{
throw new Exception("Division by zero", 1);
}
return $dividend / $divisor;
}
try {
echo
divide(5, 0);
} catch(Exception $ex) {
$code = $ex->getCode();
$message = $ex->getMessage();
$file = $ex->getFile();
$line = $ex->getLine();
echo "Exception thrown in $file on line
$line: [Code $code]
$message";
}
?>
Referência de exceção completa
Para obter uma referência completa, acesse nossa Referência Completa de Exceções PHP .
A referência contém descrições e exemplos de todos os métodos Exception.