Php, ¿hay alguna forma de convertir todos los avisos/advertencias en una excepción?

2 minutos de lectura

Ya configuré mi controlador de errores:

set_error_handler (function($errno, $errstr, $errfile,  $errline, array $errcontext) {
  $s = date('Ymd_His');
  switch ($errno)
  {
    case E_USER_ERROR:
      $s.= '_E_';
      break;
    case E_USER_WARNING:
      $s.= '_W_';
      break;
    case E_USER_NOTICE:
      $s.= '_N_';
      break;
    default:
      $s.= '_U_';
      break;
    }
    file_put_contents (APP_PATH_CACHE.'/log'.$s.'_'.rand(1,99999).'.html', print_r(get_defined_vars(), true));
}, E_ALL);

pero ¿puede convertirse en una excepción? Para que pudiera ver el flujo.

  • No entiendo los votos negativos. ¿Duplicado de la pregunta 10520390? De todos modos, votando…

    – Felipmartins

    28 de septiembre de 2015 a las 12:21

  • Bueno, para mí no fue sencillo. Si lanzo solo una excepción, el seguimiento inverso conducirá al controlador de errores, no a la fuente del mismo. Problema similar con “errores fatales” en “apagado”

    – John Smith

    28 de septiembre de 2015 a las 14:39

  • @JohnSmith, el seguimiento inverso cruza la ubicación del controlador de errores, pero no se detiene allí, continúa hasta la línea donde se generó el error, consulte 3v4l.org/CpsPS , todos mencionan la línea 13, donde se generó el error. (desde al menos php 5.1, pero probablemente antes, pero con pruebas cba porque se introdujo ErrorException en 5.1)

    – hanshenrik

    27 de mayo de 2018 a las 10:48

Sí. esta es exactamente la razón por la que se creó la excepción ErrorException. ver http://php.net/manual/en/class.errorexception.php

function exception_error_handler($severity, $message, $file, $line) {
    if (!(error_reporting() & $severity)) {
        // This error code is not included in error_reporting
        return;
    }
    throw new ErrorException($message, 0, $severity, $file, $line);
}
set_error_handler("exception_error_handler");

Sí, se puede hacer simplemente. La mejor manera es crear su propia clase que se extienda desde \Exception y en su error_handler() lanzar el objeto de esta nueva clase.

Puedes hacerlo también de forma sencilla después

file_put_contents (APP_PATH_CACHE.'/log'.$s.'_'.rand(1,99999).'.html', print_r(get_defined_vars(), true));

agregar

throw new Exception($errst, $errno); donde el primer parámetro es el mensaje y el segundo es el número de error

¿Ha sido útil esta solución?