Puis-je try/catch un avertissement?
J'ai besoin d'attraper quelques mises en garde d'être levée à partir de certaines fonctions natives de php et puis gérer.
Spécifiquement:
array dns_get_record ( string $hostname [, int $type= DNS_ANY [, array &$authns [, array &$addtl ]]] )
Il lance un avertissement lorsque la requête DNS échoue.
try
/catch
ne fonctionne pas parce qu'un avertissement n'est pas une exception.
J'ai maintenant 2 options:
-
set_error_handler
semble exagéré, parce que je dois l'utiliser pour filtrer chaque avertissement dans la page (est-ce vrai?); -
Ajuster le rapport d'erreur/d'affichage de sorte que ces avertissements ne pas obtenir un écho à l'écran, puis vérifier la valeur de retour; si c'est
false
, aucun enregistrement n'est trouvé pour le nom d'hôte.
Quelle est la meilleure pratique ici?
- stackoverflow.com/questions/136899/... est un bon sujet de discussion, sur des choses comme cela.
- il y avait une réponse ci-dessous qui ont été supprimés? soit par le propriétaire ou par quelqu'un?
- voir aussi: stackoverflow.com/questions/1087365
- Oui. Par le propriétaire.
Vous devez vous connecter pour publier un commentaire.
Définir et de restauration de gestionnaire d'erreur
Une possibilité est de définir votre propre gestionnaire d'erreur avant l'appel et de rétablir le précédent gestionnaire d'erreur plus tard avec
restore_error_handler()
.Vous pouvez construire sur cette idée, et écrire une ré-utilisable gestionnaire d'erreur, qui enregistre les erreurs pour vous.
Tournant des erreurs dans les exceptions
Vous pouvez utiliser
set_error_handler()
et laErrorException
classe à tour toutes les erreurs php dans les exceptions.La chose importante à noter lors de l'utilisation de votre propre gestionnaire d'erreur est qu'il ignore l'
error_reporting
réglage et passer toutes les erreurs (les avertissements, mises en garde, etc.) à votre gestionnaire d'erreur. Vous pouvez définir un deuxième argument en faveur deset_error_handler()
pour définir les types d'erreur que vous souhaitez recevoir, ou de l'accès au réglage du courant à l'aide de... = error_reporting()
à l'intérieur du gestionnaire d'erreur.La suppression de l'avertissement
Une autre possibilité est de supprimer l'appel avec l'opérateur @ et vérifier la valeur de retour de
dns_get_record()
par la suite. Mais je vous le déconseille cette comme des erreurs/alertes sont déclenchées à être manipulés, de ne pas être supprimé.restore_error_handler()
dans unfinally
, sinon il ne pourrait pas obtenir de réinitialisation.La solution qui fonctionne vraiment s'est avéré être le réglage de simple gestionnaire d'erreur avec
E_WARNING
paramètre, comme ceci:callable
peut être utilisé ici à la place de string avec une déclaration de fonctiontrow new \Exception($errstr, $errno);
à l'intérieur dewarning_handler
fonction. Merci.Être prudent avec les
@
opérateur - alors qu'il supprime les avertissements, il supprime également les erreurs fatales. J'ai passé beaucoup de temps à déboguer un problème dans un système où quelqu'un avait écrit@mysql_query( '...' )
et le problème était que le support de mysql n'a pas été chargé en PHP et il jeta un silencieux erreur fatale. Il sera à l'abri de ces choses qui font partie du coeur de PHP, mais veuillez de les utiliser avec prudence.Aucune autre sortie - bonne chance de débogage ce!
Ce temps, on peut voir pourquoi il a échoué.
Je voulais try/catch un avertissement, mais en même temps garder l'habitude d'avertissement/d'erreur d'enregistrement (par exemple, dans
/var/log/apache2/error.log
); le gestionnaire doit retournerfalse
. Cependant, depuis le "throw new..." principe interrompt l'exécution, on a alors à faire de la "enveloppez-les dans la fonction" truc, également présentés dans:Est-il statique de la façon de lancer une exception en php
Ou, en bref:
EDIT: après avoir regarder de plus près, il s'avère qu'il ne fonctionne pas: le "
return false && throwErrorException ...
" sera, pour l'essentiel, pas jeter l'exception, et il suffit de vous connecter dans le journal des erreurs; le retrait du "false &&
" partie, comme dans "return throwErrorException ...
", fera l'exception de jeter de travail, mais alors pas du journal dans le error_log... je l'avais toujours garder cette posté, même si, comme je n'ai pas vu ce comportement documenté ailleurs.Vous devriez probablement essayer de se débarrasser de l'avertissement complètement, mais si c'est pas possible, vous pouvez faire précéder l'appel avec @ (c'est à dire @dns_get_record(...)) et ensuite utiliser les informations que vous pouvez obtenir pour savoir si l'avertissement qui s'est passé ou pas.
Normalement vous ne devriez jamais utiliser le @, sauf si c'est la seule solution. Dans ce cas, la fonction dns_check_record doit être utiliser en premier pour savoir si l'enregistrement existe.
La combinaison de ces lignes de code autour d'un
file_get_contents()
appel à une url externe m'a aidé à gérer des avertissements du genre "failed to open stream: Connection timed out" beaucoup mieux:Cette solution fonctionne à l'intérieur du contexte de l'objet, trop. Vous pouvez l'utiliser dans une fonction:
Si
dns_get_record()
échoue, il doit retournerFALSE
, de sorte que vous pouvez supprimer le message d'avertissement avec@
puis vérifier la valeur de retour.essayer de vérifier s'il retourne certaine valeur booléenne, alors vous pouvez simplement mettre une condition. J'ai rencontré avec de la oci_execute(...) qui a été le retour de certains violation avec mes clés uniques.
FolderStructure
CustomException.php
il suffit d'inclure le fichier ci-dessus dans votre fichier de script comme ceci
index.php
Je recommanderais à l'aide de @ à supprimer les avertissements lorsque c'est une opération simple (par exemple, $prop = @($haut/($largeur - $depth)); de sauter la division par zéro mises en garde). Cependant, dans la plupart des cas, il est mieux à gérer.