Manipulador de exceção de conjunto PHP

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.logLinguagem 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.phparquivo:

<?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.phparquivo, 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.logarquivo localizado no logsdiretório.

O segundo argumento ( 3) da error_log()função indica que ela anexará a entrada de log ao errors.logarquivo.

Terceiro, coloque o seguinte código no index.phparquivo:

<?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.phpirá mostrar a seguinte mensagem:

Whoops, looks like something went wrong!Linguagem de código:  texto simples  ( texto simples )

Se você olhar o errors.logarquivo, 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 stringsLinguagem 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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *