182 votos

¿Puedo try/catch una advertencia?

Tengo que tomar algunas advertencias lanzadas desde algunas funciones nativas de php y luego manejar.

Específicamente:

array dns_get_record  ( string $hostname  [, int $type= DNS_ANY  [, array &$authns  [, array &$addtl  ]]] )

Lanza una advertencia cuando la consulta DNS falla.

try/catch no funciona debido a una advertencia no es una excepción.

Ahora tengo 2 opciones:

  1. set_error_handler parece una exageración porque tengo que usar para filtrar cada advertencia en la página (esto es verdad?);

  2. Ajuste de informe de errores/pantalla para que estas advertencias no obtener eco en la pantalla, a continuación, compruebe el valor de retorno; si es false, no hay registros de nombre de host.

¿Cuál es la mejor práctica aquí?

209voto

Philippe Gerber Puntos 6360

Establecer y restaurar el controlador de errores

Una posibilidad es establecer su propio manejador de errores antes de la llamada y restaurar el anterior controlador de error después con restore_error_handler().

set_error_handler(function() { /* ignore errors */ });
dns_get_record();
restore_error_handler();

Usted podría basarse en esta idea y escribir una re-utilizable controlador de error que registra los errores de usted.

set_error_handler([$logger, 'onSilencedError']);
dns_get_record();
restore_error_handler();

Giro de errores en las excepciones

Usted puede utilizar set_error_handler() y a las ErrorException clase a su vez todos los errores de php en excepciones.

set_error_handler(function handleError($errno, $errstr, $errfile, $errline, array $errcontext) {
    // error was suppressed with the @-operator
    if (0 === error_reporting()) {
        return false;
    }

    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
});

try {
    dns_get_record();
} catch (ErrorException $e) {
    // ...
}

La cosa importante a tener en cuenta al usar su propio manejador de errores es que se pasará por alto el error_reporting ajuste y pasar todos los errores (avisos, advertencias, etc.) para su controlador de error. Usted puede establecer un segundo argumento en set_error_handler() definir que tipos de error que desea recibir, o acceder a la configuración actual utilizando ... = error_reporting() dentro del manejador de errores.

La supresión de la advertencia

Otra posibilidad es la de suprimir la llamada con el operador @ y comprobar el valor de retorno dns_get_record() después. Pero le advierto que esta como a errores/advertencias se activan para ser manejado, a no ser suprimida.

51voto

Robert Puntos 121

La solución que funciona realmente resultó ser configuración de controlador de errores simples con E_WARNING parámetro, así:

set_error_handler("warning_handler", E_WARNING);

dns_get_record(...)

function warning_handler($errno, $errstr) { 
// do something
}

16voto

GuruBob Puntos 163

Tenga cuidado con el operador @ - mientras suprime las advertencias que también suprime la aparición de errores fatales. Me pasé un montón de tiempo a la depuración de un problema en un sistema en el que alguien había escrito @mysql_query( '...' ) y el problema era que el soporte de mysql no fue cargado en PHP y lanzó un silencio fatal error. Será seguro para aquellas cosas que son parte del núcleo de PHP, pero por favor, use con cuidado.

bob@mypc:~$ php -a
Interactive shell

php > echo @something(); // this will just silently die...

No hay más salida - buena suerte depuración de esto!

bob@mypc:~$ php -a
Interactive shell

php > echo something(); // lets try it again but don't suppress the error
PHP Fatal error:  Call to undefined function something() in php shell code on line 1
PHP Stack trace:
PHP   1. {main}() php shell code:0
bob@mypc:~$ 

Esta vez podemos ver por qué ha fallado.

+1 para la configuración del controlador de error - no puedo upvote porque no tengo suficiente rep todavía.

3voto

Rusky Puntos 701

Probablemente deberías tratar de deshacerse de la advertencia totalmente, pero si eso no es posible, se puede anteponer la llamada con @ (es decir, @dns_get_record(...)) y usar cualquier información puede llegar a averiguar si la advertencia ocurrió o no.

3voto

florynth Puntos 31

Normalmente nunca utilice a menos que esta es la única solución. En ese caso específico que la función dns_check_record debe utilizar primero para saber si existe el registro.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X