2009-07-04 6 views
5

J'ai récemment travaillé avec Exceptions. Je pense qu'il est logique d'enregistrer des exceptions non interceptées, car cela aide grandement les développeurs à prendre en charge d'éventuels problèmes dans la source en consultant simplement le journal des exceptions. Cependant, lorsqu'une exception est traitée, est-il nécessaire de l'enregistrer plus longtemps? Oui, dans une certaine mesure. Si vous avez de "mauvais" développeurs qui écrivent du code contenant des bogues, alors en attrapant simplement des exceptions, vous les ferez disparaître. Par exemple:Journalisation interceptée et exceptions non interceptées?

try 
{ 
fopen('/path/to/file','w'); 
} 
catch (Exception $e) 
{ 
// Display an error to user 
} 

Le code ci-dessus est PHP. Le fait est que ce genre de code, imo, ne devrait pas exister. Les exceptions sont censées être exceptionnelles et se produire rarement, mais avec ce code elles se produisent plus que rarement. Par exemple, le développeur ne vérifie pas si le fichier existe et il ne vérifie pas s'il a les permissions pour écrire dessus. Au lieu de cela, il devrait être:

try 
{ 
if (file_exists('/path/to/file') && is_writable('/path/to/file')) 
    fopen('/path/to/file','w'); 
else 
    // Display an error to user about file not existing or not being writable 
} 
catch (Exception $e) 
{ 
// Display an error to user about an unexpected error 
} 

Cela fait beaucoup de sens maintenant. L'exception est lancée et interceptée uniquement si elle est exceptionnelle (par exemple, panne de serveur, panne de courant, etc.). Mais que se passe-t-il si le développeur utilise Exceptions pour tout et les vérifications omises - est-ce qu'il y a un moyen pour moi de consigner les exceptions interceptées?

Je ne veux pas que les développeurs mettent tout dans des blocs try-catch pour "résoudre" les problèmes. Je veux qu'ils vérifier explicitement ce qu'ils doivent vérifier - et laisser des exceptions pour des situations exceptionnelles comme une défaillance matérielle, panne du serveur, etc.

Répondre

1

Je ne pense pas qu'il existe une approche de type méthode magique si c'est ce que vous cherchez. Mais est-il possible d'envelopper votre application entière dans une structure try... catch...? Par définition, toutes les exceptions qui atteignent le try... catch... ne sont pas capturées ... ou est-ce que je manque le point ;-)

+2

set_exception_handler (http://www.php.net/manual/fr/function.set-exception-handler.php) – troelskn

12

Des exceptions sont censées être exceptionnelles et se produisent rarement, mais avec ce code, ils se produisent plus rarement.

Je pense que c'est une idée fausse. Le point d'exception consiste à séparer le flux idéal du flux de gestion des erreurs.

+0

exceptions exceptionnelles –

0

Je suis d'accord avec le commentaire de troelskn que vous devriez simplement accepter les exceptions comme une façon valide de durcir le code. Si vous souhaitez toujours consigner les exceptions non interceptées, vous devez demander à tous vos développeurs de les passer à une fonction de journalisation (par exemple, log_exception($e)) ou les capturer tous dans un try/catch de haut niveau et les y connecter . Vous pouvez également utiliser un outil tel que PHP_CodeSniffer pour détecter du code écrit comme votre premier exemple, mais ce n'est pas une excellente solution. Vous auriez besoin d'écrire votre propre sniff pour détecter ce cas; il pourrait rechercher un bloc try ne contenant aucune instruction if.

6

Vous pouvez utiliser la fonction set_exception_handler de PHP, cela vous permettra de fournir une fonction qui capturera toutes les exceptions non interceptées mais vous devrez ajouter une journalisation manuelle pour toutes celles qui sont interceptées dans vos scripts.

Questions connexes