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));
Était-ce utile?

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));
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top