Ver Mensaje Individual
  #11 (permalink)  
Antiguo 13/07/2010, 22:27
Avatar de abimaelrc
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