blocs try-catch PHP: sont-ils capables d'attraper les types de arg invalides?
Question
Contexte: Supposons que je donne les résultats suivants PHP-évidemment incorrect:
try{
$vtest = '';
print(array_pop($vtest));
}catch(Exception $exx){}
Pour que cela fonctionne avec array_pop, $ vtest devrait évidemment être un tableau, pas une chaîne. Néanmoins, quand je lance ce code que l'avertissement est exposé. Je ne veux pas, je veux juste le code d'échouer en silence.
Question: Y at-il quelque chose de spécial PHP try-catch par rapport à d'autres langues qui provoquent ce ne pas travailler
Disclaimer: Juste pour référence, il est vrai qu'il existe d'autres façons de gérer cette situation en PHP, mais ceux-ci ne sont pas souhaitables. L'objectif est d'éviter ici:
L'astuce "arobase":
$vtest = '';
print(@array_pop($vtest)); // <-- would like to avoid this
Type Avec:
$vtest = '';
$vtest = (array)$vtest;
print(array_pop($vtest));
La solution
Les avertissements et les avis ne sont pas techniquement des exceptions en PHP. Pour attraper une exception, il doit être explicitement jeté, et la plupart des bibliothèques intégrées de fonctions ne jette pas des exceptions (surtout parce qu'ils ont été écrits avant exceptions PHP pris en charge).
Il aurait été bien si en quelque sorte des exceptions ont été construites au-dessus de l'avis existant / avertissement / cadre d'erreur, mais peut-être que demande trop.
Autres conseils
Un avertissement sera toujours produit par le code que vous avez fourni mais vous pouvez utiliser set_error_handler pour dicter la façon dont l'avertissement est manipulé; à-dire que vous pouvez le faire jeter une exception. De plus, vous pouvez utiliser restore_error_handler pour revenir par défaut erreur la manipulation lorsque vous avez terminé.
function errorHandler($errno, $errstr, $errfile, $errline) {
throw new Exception($errstr, $errno);
}
set_error_handler('errorHandler');
Vous pouvez attraper ces erreurs lorsque vous convertissez toutes les erreurs d'une exception. J'ai mis un peu environnement de gestion des erreurs . Il suffit de le tester -. Il travaillera
La seule façon que je peux penser serait de faire ce qui suit:
try{
$vtest = '';
if(is_array($vtest)){
print(array_pop($vtest));
}
else{
throw new NotArrayException()
}
}catch(NotArrayException $exx){}
Bien sûr, si vous voulez juste faire en silence, vous pouvez simplement faire ce qui suit puisque vous ne devez prendre aucune exception:
$vtest = '';
if(is_array($vtest)){
print(array_pop($vtest));
}