Foros del Web » Programando para Internet » PHP »

set_error_handler() No vale para casos de "Fatal error" ?

Estas en el tema de set_error_handler() No vale para casos de "Fatal error" ? en el foro de PHP en Foros del Web. Hola, tengo esta y 100 funciones + que NUNCA capturan el error de will_this_undefined_function_raise_an_error . He buscado en PHP.NET y 50 sitios + y no ...
  #1 (permalink)  
Antiguo 13/07/2010, 15:50
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
set_error_handler() No vale para casos de "Fatal error" ?

Hola,

tengo esta y 100 funciones + que NUNCA capturan el error de will_this_undefined_function_raise_an_error.

He buscado en PHP.NET y 50 sitios + y no hallo solución alguna.

Siempre se dispara:

Fatal error: Call to undefined function will_this_undefined_function_raise_an_error() in F:\webs\test.php on line 20

Alguien conoce como capturarlo?

Cita:
<?php
set_error_handler("eh");
function eh($type, $msg, $file, $line, $context)
{
echo "<h1>Error!</h1>";
echo "An error occured while executing this script. Please contact the <a href=mailto:[email protected]>Webmaster</a> to report this error";

echo "<p>";
echo "Here is the information provided by the script";
echo "<hr><pre>";
echo "Error code : $type <br>";
echo "Error message : $message <br>";
echo "Script name and line number of error : $file:$line <br>";
echo "Variable state when error occurred: <br>";
print_r($context);
echo "</pre><hr>";
}

echo $QQQ;
will_this_undefined_function_raise_an_error();
?>
  #2 (permalink)  
Antiguo 13/07/2010, 15:55
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: set_error_handler() No vale para casos de "Fatal error" ?

Porque no existe esa función. ¿Donde la tienes declarada?
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 13/07/2010, 16:36
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Respuesta: set_error_handler() No vale para casos de "Fatal error" ?

Abimael efectivamernte NO EXISTE, pero he declarado

set_error_handler()

Ya haz leido que hace?

Precisamente: por que set_error_handler no hace lo que debe hacer?

Gratitud
  #4 (permalink)  
Antiguo 13/07/2010, 17:37
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: set_error_handler() No vale para casos de "Fatal error" ?

¿Y tratando el ejemplo de php, no te dio resultado?
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #5 (permalink)  
Antiguo 13/07/2010, 18:30
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Segun este personaje

"set_error_handler() doesn’t catch fatal errors - as the PHP docs say"

(set_error_handler() no reconoce fatal erros como dice la documentación de PHP)

http://insomanic.me.uk/post/22985107...e-error-with-a

EL esta en lo correcto?

Y claro, he hallado unos 5 "TRICKS" o "HACKS"...

Pero la funcion como tal tiene ese BUG ?

Última edición por GatorV; 13/07/2010 a las 18:56
  #6 (permalink)  
Antiguo 13/07/2010, 18:59
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Respuesta: set_error_handler() No vale para casos de "Fatal error" ?

Carambas!!!

Segun este otro personaje definitivamente la funcion no trabaja como se espera:

---------------------
Note: It's important to note that parse errors and fatal errors, because of their very nature, will bypass the custom error handler and will be displayed using the standard PHP error-handling mechanism. Display of these errors can be controlled using the standard error_reporting() function, as discussed previously.
---------------------

http://articles.techrepublic.com.com...1-6113787.html

...y justo la idea es capturar los errores de PARSEO y FATALES...
  #7 (permalink)  
Antiguo 13/07/2010, 19:00
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: set_error_handler() No vale para casos de "Fatal error" ?

Si es posible. En la pagina hay un claro ejemplo usando fatal error. Puedes usar is_callable para verificar las funciones.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #8 (permalink)  
Antiguo 13/07/2010, 19:04
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: set_error_handler() No vale para casos de "Fatal error" ?

No es un bug, lo que pasa es como dice la documentación, cachar un error de esos podria dejar el script en un estado inestable, es por eso que ese tipo de errores nunca son cachados.

Saludos.
  #9 (permalink)  
Antiguo 13/07/2010, 19:16
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: set_error_handler() No vale para casos de "Fatal error" ?

Bueno en la documentacion hay un ejemplo con fatal error. Entiendo que no todos lo que se muestra como fatal error son cachable, pero si algunos como el ejemplo que tienen. Como el listado que menciona al principio en la documentacion.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #10 (permalink)  
Antiguo 13/07/2010, 19:58
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Respuesta: set_error_handler() No vale para casos de "Fatal error" ?

Abimael por favor cita lo que mencionas.

NO LO VEO... :(

http://www.phpbsd.net/tag/error-handler/
----------------------
Según este mensaje de la lista de desarrollo del PHP (fijaros en los autores) los fatal errors nunca podrán ser capturados en el userland, por ejemplo con un handler de errores personalizado, ya que en estos casos el intérprete es probable que quede en un estado inestable y es necesario de una terminación rápida y limpia.
----------------------

Pero justo lo que quiero es no utilizar "HACKS"...
  #11 (permalink)  
Antiguo 13/07/2010, 22:27
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: set_error_handler() No vale para casos de "Fatal error" ?

Pero si lo estoy diciendo desde el principio. Mira el ejemplo
Código PHP:
Ver original
  1. <?php
  2. // error handler function
  3. function myErrorHandler($errno, $errstr, $errfile, $errline)
  4. {
  5.     switch ($errno) {
  6.     case E_USER_ERROR:
  7.         echo "<b>My ERROR</b> [$errno] $errstr<br />\n";
  8.         echo "  Fatal error on line $errline in file $errfile";
  9.         echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
  10.         echo "Aborting...<br />\n";
  11.         exit(1);
  12.         break;
  13.  
  14.     case E_USER_WARNING:
  15.         echo "<b>My WARNING</b> [$errno] $errstr<br />\n";
  16.         break;
  17.  
  18.     case E_USER_NOTICE:
  19.         echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";
  20.         break;
  21.  
  22.     default:
  23.         echo "Unknown error type: [$errno] $errstr<br />\n";
  24.         break;
  25.     }
  26.  
  27.     /* Don't execute PHP internal error handler */
  28.     return true;
  29. }
  30.  
  31. // function to test the error handling
  32. function scale_by_log($vect, $scale)
  33. {
  34.     if (!is_numeric($scale) || $scale <= 0) {
  35.         trigger_error("log(x) for x <= 0 is undefined, you used: scale = $scale", E_USER_ERROR);
  36.     }
  37.  
  38.     if (!is_array($vect)) {
  39.         trigger_error("Incorrect input vector, array of values expected", E_USER_WARNING);
  40.         return null;
  41.     }
  42.  
  43.     $temp = array();
  44.     foreach($vect as $pos => $value) {
  45.         if (!is_numeric($value)) {
  46.             trigger_error("Value at position $pos is not a number, using 0 (zero)", E_USER_NOTICE);
  47.             $value = 0;
  48.         }
  49.         $temp[$pos] = log($scale) * $value;
  50.     }
  51.  
  52.     return $temp;
  53. }
  54.  
  55. // set to the user defined error handler
  56. $old_error_handler = set_error_handler("myErrorHandler");
  57.  
  58. // trigger some errors, first define a mixed array with a non-numeric item
  59. echo "vector a\n";
  60. $a = array(2, 3, "foo", 5.5, 43.3, 21.11);
  61. print_r($a);
  62.  
  63. // now generate second array
  64. echo "----\nvector b - a notice (b = log(PI) * a)\n";
  65. /* Value at position $pos is not a number, using 0 (zero) */
  66. $b = scale_by_log($a, M_PI);
  67. print_r($b);
  68.  
  69. // this is trouble, we pass a string instead of an array
  70. echo "----\nvector c - a warning\n";
  71. /* Incorrect input vector, array of values expected */
  72. $c = scale_by_log("not array", 2.3);
  73. var_dump($c); // NULL
  74.  
  75. // this is a critical error, log of zero or negative number is undefined
  76. echo "----\nvector d - fatal error\n";
  77. /* log(x) for x <= 0 is undefined, you used: scale = $scale" */
  78. $d = scale_by_log($a, -2.5);
  79. var_dump($d); // Never reached
En el switch menciona el primer case como E_USER_ERROR, eso es un error fatal y hasta el echo lo menciona. Sí se puede verificar algunos errores fatales, pero al parecer el error de funciones no definidas anteriormente no es posible. En ese caso hay que hacer lo que tu llamas hacks.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #12 (permalink)  
Antiguo 14/07/2010, 02:44
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Respuesta: set_error_handler() No vale para casos de "Fatal error" ?

Ah!, Abimael esa si, claro que le he probado.

Justo como menciona GAtorV no funciona...

  #13 (permalink)  
Antiguo 14/07/2010, 08:53
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: set_error_handler() No vale para casos de "Fatal error" ?

Pues no te va a quedar de otra más que utilizar HACKS ya que es por diseño que no vas a cachar errores fatales de la forma oficial.
  #14 (permalink)  
Antiguo 14/07/2010, 10:31
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Respuesta: set_error_handler() No vale para casos de "Fatal error" ?

Imaginate que hace UNA DECADA Rasmus pregunto LO MISMO:

http://marc.info/?l=php-internals&m=97673386418430&w=2

!!!
  #15 (permalink)  
Antiguo 14/07/2010, 10:44
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: set_error_handler() No vale para casos de "Fatal error" ?

pero además un error fatal involucra siempre un mal diseño, además de un mal uso del lenguaje por parte del programador...

osea, si se aprende a controlar y escribir buena programación es obvio que jamás tendrías errores fatales.... caso omiso, lo inverso!!
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:52.