Link Search Menu Expand Document

Gestió global d’excepcions

Per a complementar al nostre framework MVC anem a crear un gestor global d’excepcions.

El gestor global ens permetrà capturar tots els errors a nivell d’aplicació i mostrar als usuaris missatges més fàcils d’entendre.

A més, usarem els codi d’estat d’HTTP per a informar al navegador de quin tipus d’error s’ha produit.

La classe AppException

# src/Core/Exception/AppException.php
class AppException extends Exception
{
    /**
     * AppException constructor.
     * @param string $message
     * @param int $code
     * @param Throwable|null $previous
     */
    public function __construct($message = "Internal server error", $code = 500, 
        Throwable $previous = null)
    {
        parent::__construct($message, $code, $previous);
    }

Per defecte establirem el codi d’error a 500, que és un error intern de servidor. Quan capturem els aquestes excepcions les gestionarem mitjançant el mètode AppExecption::handleException.

Aquest mètode escriurà el codi d’estat en la capçalera HTTP i mostrarà una pàgina en l’error que s’ha produit.


# src/Core/Exception/AppException.php
/**
  * @return string
  * @throws NotFoundException
*/
public function handleException(): string
    {
    $message = $this->getMessage();
    $code = $this->getCode();

    // get the http status related to the error code
    // for instancd: 404 -> 404 Not found
    $httpStatus = $this->getHttpStatus();

    // HTTP/1.1 404 Not found    
    header($_SERVER["SERVER_PROTOCOL"] . ' ' . $httpStatus);

    $response = App::get(Response::class);
    return $response->renderView('error', 'default', compact('message', 'code'));
}
# src/Core/Exception/AppException.php
private function getHttpStatus(): string
{
    switch ($this->getCode()) {
        case 404:
            $status = "404 Not Found";
            break;

        case 403:
            $status = "403 Forbidden";
            break;

        default:
            $status = "500 Internal Server Error";

    }
    return $status;
}

Una vegada implementada la classe caldra fer-ne un en el controlador frontal de forma que si hi ha excepcions globals AppException, o en alguna classe filla, en activar una ruta es capturen i es gestionen en el mètode AppException::handleException.

** Activitat 11: Gestor global d’errors **

Implementa la classe AppException seguint les indicacions. Fes-ne ús en el controlador frontal.

Aquelles excepcions que podem considerar a nivell d’aplicació, com per exemple, NotFoundException haurien d’heretar de AppException i així poder ser capturades en el controlador frontal. Així si accedim a una ruta inexistent ens hauria de mostrar el típic error 404.

Recorda que les excepcions sols es poden capturar una vegada.