Resumo : neste tutorial, você aprenderá como definir um manipulador de exceções usando a set_exception_handler()
função PHP.
Introdução à função set_exception_handler do PHP
Na prática, é muito difícil capturar todas as exceções possíveis . Se uma exceção não for detectada, você verá a mensagem de exceção na página.
O PHP permite que você capture exceções não detectadas registrando um manipulador de exceções global.
O manipulador de exceção global permite mostrar uma mensagem amigável aos usuários enquanto registra as informações importantes em um arquivo de log para solução de problemas posterior.
Para registrar um manipulador de exceção global, você usa a set_exception_handler()
função.
A set_exception_handler()
função aceita um callable onde você pode colocar o código para lidar com as exceções não detectadas. Por exemplo:
<?php
set_exception_handler(function ($ex) {
// handle the uncaught exception
});
Linguagem de código: HTML, XML ( xml )
Para usar uma função global, você pode passar o nome da função para a set_exception_handler()
função assim:
<?php
set_exception_handler('handle_exceptions');
Linguagem de código: HTML, XML ( xml )
Caso você queira usar um método de um objeto , você precisa passar um array onde o primeiro elemento é o objeto e o segundo elemento é o nome do método. Por exemplo:
class ExceptionHandler
{
public function handle(Exception $ex)
{
// code to handle the exception
}
}
$handler = new ExceptionHandler();
set_exception_handler([$handler, 'handle']);
Linguagem de código: PHP ( php )
Observe que o método do objeto deve ser público para ser usado como manipulador de exceções.
Da mesma forma, você pode usar um método estático público de uma classe como manipulador de exceções:
<?php
class ExceptionHandler
{
public static function handle(Exception $ex)
{
// code to handle the exception
// ...
}
}
set_exception_handler(['ExceptionHandler', 'handle']);
Linguagem de código: HTML, XML ( xml )
Exemplo de set_exception_handler em PHP
Primeiro, crie a seguinte estrutura de diretórios com os arquivos correspondentes como este:
.
├── bootstrap.php
├── index.php
└── logs
└── errors.log
Linguagem de código: texto simples ( texto simples )
Nome do arquivo | Diretório | Descrição |
---|---|---|
bootstrap.php | . | contém o código para inicializar o aplicativo |
index.php | . | é a página de entrada do aplicativo |
erros.log | Histórico | contém as informações de registro |
Segundo, adicione o seguinte código ao bootstrap.php
arquivo:
<?php
set_exception_handler(function (Exception $ex) {
// set default timezone
date_default_timezone_set('America/Los_Angeles');
// get the current date & time
$time = date('F j, Y, g:i a e O');
// format the exception message
$message = "[{$time}] {$ex->getMessage()}\n";
// append to the error log
error_log($message, 3, 'logs/errors.log');
// show a user-friendly message
echo 'Whoops, looks like something went wrong!';
});
Linguagem de código: HTML, XML ( xml )
No bootstrap.php
arquivo, definimos o fuso horário padrão como 'America/Los_Angeles'
, obtemos a data e hora atuais, formatamos a mensagem de exceção e registramos no errors.log
arquivo localizado no logs
diretório.
O segundo argumento ( 3
) da error_log()
função indica que ela anexará a entrada de log ao errors.log
arquivo.
Terceiro, coloque o seguinte código no index.php
arquivo:
<?php
require 'bootstrap.php';
function add($a, $b)
{
if (!is_numeric($a) || !is_numeric($a)) {
throw new InvalidArgumentException('Both arguments must be numeric or numeric strings');
}
return $a + $b;
}
echo add('Hi', 'there');
Linguagem de código: HTML, XML ( xml )
Inclui index.php
o arquivo bootstrap.php
. E define uma função chamada add()
que retorna a soma de dois números.
No entanto, a chamada de função add('Hi', 'there')
usa argumentos de string em vez de números. Portanto, lançará uma exceção InvalidArgumentException
.
Como esta exceção não é capturada no index.php
, o manipulador de exceção global irá capturá-la. O index.php
irá mostrar a seguinte mensagem:
Whoops, looks like something went wrong!
Linguagem de código: texto simples ( texto simples )
Se você olhar o errors.log
arquivo, encontrará algo como:
[April 10, 2021, 8:35 pm America/Los_Angeles -0700] File: ...\index.php, Line: 8, Message: Both arguments must be numeric or numeric strings
Linguagem de código: texto simples ( texto simples )
Resumo
- Use a
set_exception_handler()
função para registrar um manipulador de exceções global que trata de exceções não detectadas.