J'ai besoin d'attraper quelques avertissements provenant de certaines fonctions natives php, puis de les gérer.
Plus précisément:
array dns_get_record ( string $hostname [, int $type= DNS_ANY [, array &$authns [, array &$addtl ]]] )
Il émet un avertissement lorsque la requête DNS échoue.
try
/ catch
ne fonctionne pas car un avertissement ne fait pas exception.
J'ai maintenant 2 options:
set_error_handler
semble exagéré car je dois l'utiliser pour filtrer chaque avertissement de la page (est-ce vrai?);Ajustez le rapport / affichage des erreurs afin que ces avertissements ne soient pas répercutés à l'écran, puis vérifiez la valeur de retour; si c'est le cas
false
, aucun enregistrement n'est trouvé pour le nom d'hôte.
Quelle est la meilleure pratique ici?
php
error-handling
try-catch
user121196
la source
la source
Réponses:
Définir et restaurer le gestionnaire d'erreurs
Une possibilité consiste à définir votre propre gestionnaire d'erreurs avant l'appel et à restaurer le gestionnaire d'erreurs précédent ultérieurement avec
restore_error_handler()
.Vous pouvez construire sur cette idée et écrire un gestionnaire d'erreurs réutilisable qui enregistre les erreurs pour vous.
Transformer les erreurs en exceptions
Vous pouvez utiliser
set_error_handler()
et laErrorException
classe pour transformer toutes les erreurs php en exceptions.La chose importante à noter lors de l'utilisation de votre propre gestionnaire d'erreurs est qu'il contournera le
error_reporting
paramètre et transmettra toutes les erreurs (notifications, avertissements, etc.) à votre gestionnaire d'erreurs. Vous pouvez définir un deuxième argumentset_error_handler()
pour définir les types d'erreur que vous souhaitez recevoir ou accéder au paramètre actuel à l'aide... = error_reporting()
du gestionnaire d'erreurs.Supprimer l'avertissement
Une autre possibilité consiste à supprimer l'appel avec l'opérateur @ et à vérifier ensuite la valeur de retour
dns_get_record()
. Mais je déconseille cela car les erreurs / avertissements sont déclenchés pour être traités, et non supprimés.la source
La solution qui fonctionne vraiment s'est avérée être de définir un gestionnaire d'erreurs simple avec un
E_WARNING
paramètre, comme ceci:la source
callable
peut être utilisé ici au lieu de chaîne avec déclaration de fonctiontrow new \Exception($errstr, $errno);
intérieurwarning_handler
. Merci.Soyez prudent avec l'
@
opérateur - s'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 mysql n'était pas chargé dans PHP et cela a provoqué une erreur fatale silencieuse. Il sera sûr pour les choses qui font partie du noyau PHP, mais veuillez l' utiliser avec précaution.Aucune sortie supplémentaire - bonne chance pour le débogage!
Cette fois, nous pouvons voir pourquoi il a échoué.
la source
Je voulais essayer / attraper un avertissement, mais en même temps garder la journalisation d'avertissement / erreur habituelle (par exemple dans
/var/log/apache2/error.log
); pour lequel le gestionnaire doit retournerfalse
. Cependant, puisque l'instruction "throw new ..." interrompt fondamentalement l'exécution, il faut alors faire l'astuce "wrap in function", également discutée dans:Existe-t-il un moyen statique de lever l'exception dans php
Ou, en bref:
EDIT: après un examen plus approfondi, il s'avère que cela ne fonctionne pas: le "
return false && throwErrorException ...
" ne lève pas l'exception, et se connecte simplement au journal des erreurs; la suppression de lafalse &&
partie " ", comme dans "return throwErrorException ...
", fera fonctionner la levée d' exceptions, mais ne se connectera pas dans le error_log ... Je garderais quand même cela affiché, car je n'ai pas vu ce comportement documenté ailleurs.la source
Vous devriez probablement essayer de vous débarrasser complètement de l'avertissement, mais si ce n'est pas possible, vous pouvez ajouter l'appel à @ (c'est-à-dire @dns_get_record (...)), puis utiliser toutes les informations que vous pouvez obtenir pour déterminer si l'avertissement s'est produit ou pas.
la source
Normalement, vous ne devez jamais utiliser @ sauf si c'est la seule solution. Dans ce cas spécifique, la fonction dns_check_record doit être utilisée en premier pour savoir si l'enregistrement existe.
la source
La combinaison de ces lignes de code autour d'un
file_get_contents()
appel vers une URL externe m'a aidé à gérer les avertissements du type " Échec de l'ouverture du flux: la connexion a expiré " bien mieux:Cette solution fonctionne également dans le contexte de l'objet. Vous pouvez l'utiliser dans une fonction:
la source
En cas d'
dns_get_record()
échec, il doit revenirFALSE
, vous pouvez donc supprimer l'avertissement avec@
puis vérifier la valeur de retour.la source
essayez de vérifier s'il retourne une valeur booléenne, vous pouvez simplement le mettre comme condition. J'ai rencontré cela avec le oci_execute (...) qui renvoyait une violation avec mes clés uniques.
la source
DossierStructure
CustomException.php
il suffit d'inclure le fichier ci-dessus dans votre fichier de script comme celui-ci
index.php
la source
Je ne recommanderais d'utiliser @ pour supprimer les avertissements que lorsque c'est une opération simple (par exemple $ prop = @ ($ high / ($ width - $ depth)); pour ignorer la division par zéro avertissement). Cependant, dans la plupart des cas, il est préférable de gérer.
la source