2010-02-22 5 views
4

En utilisant Adobe ColdFusion version 8 et inférieure, tous mes cfqueries sont encapsulés dans un try catch qui appelle une fonction dans database.cfc appelée "CatchError".Bonne routine try/catch à usage général

<cftry> 
    <cfquery datasource="myDatasource"> 
    UPDATE TableName SET 
    ... 
    WHERE ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.ID#"> 
    </cfquery> 
    <cfcatch> 
     <cfset local.result = Variables.objDatabase.CatchError(cfcatch)> 
    </cfcatch> 
</cftry> 

Q1: Y at-il un bon receveur d'erreur d'usage général qui a été écrit qui prend en compte tous les différents types d'exception (Tout, demande, Base de données, Expression, verrouillage, MissingInclude, objet, sécurité, modèle et SearchEngine) ? Q2: Je pense que je voudrais aussi enregistrer ces erreurs, peut-être pas dans un fichier texte mais dans une base de données. Bien sûr, vous voyez le problème avec cela ... la journalisation des erreurs de base de données dans la base de données ...

Q3: Et je pourrais vouloir envoyer un courriel à quelqu'un si c'est la première erreur de cette session.

Répondre

2

Je pense que vos questions s'appliquent à la gestion des erreurs en général, de sorte que vous pouvez trouver quelques réponses utiles dans les questions de langue agnostique. 1. Soldarnal a répondu à la question 1 et j'aurais tendance à être d'accord: il faut beaucoup de travail pour essayer d'attraper chaque endroit où une erreur peut se produire, comme une interaction avec une base de données, et mieux d'avoir un gestionnaire d'erreur global. et utilisez try/catch dans les endroits où il y a une forte probabilité d'occurrence d'une erreur et que vous voulez que l'exécution se poursuive (généralement si votre site ne peut pas accéder à votre base de données, il est un peu bloqué).

2. En ce qui concerne la journalisation, cflog est la plus robuste car vous pouvez presque toujours vous connecter à un fichier à moins de problèmes graves avec votre serveur. cfmail est la suivante - le serveur doit mettre en file d'attente tous les mails qu'il ne peut pas envoyer, mais il y a plus à se tromper. Suivant est cfhttp vous pouvez vous connecter vos erreurs sur un site externe, mais il devra être en place lorsque l'erreur est envoyée ou vous allez le perdre. Enfin, vous pouvez vous connecter à une base de données, mais encore une fois si cela vous bloque.

Vous pouvez utiliser une combinaison, par ex. consignez les erreurs dans une base de données, à moins que la base de données ne soit indisponible, puis connectez-vous aux fichiers et réinsérez les erreurs dans la base de données lors de la sauvegarde.

3. Si vous effectuez un suivi des erreurs, par ex. dans une base de données ou via un service externe, vous devriez pouvoir configurer ceci pour vous envoyer des emails sur la première erreur ou cfmail vous permettra d'envoyer du courrier sur toutes les erreurs. Nous utilisons un script de gestion d'erreur construit sur mesure, mais il peut y avoir quelques flottants sur le web.

1

Dans votre application.cfc, dans la fonction OnRequestStart, vous pouvez ajouter cette ligne:

<cferror type="EXCEPTION" exception="any" template="act-error.cfm"> 

En règle générale sur acte error.cfm que vous voulez afficher le code html utilisateur qui indique qu'ils ont rencontré une exception non gérée (dans une langue plus conviviale) avec quelques liens amicaux. De plus, sur act-error vous pouvez toujours accéder à toutes les variables, y compris la variable error pour faire ce que vous voulez (log, email, mettre à jour une variable de session etc ...). De toute évidence, comme vous le dites, la connexion à une base de données échouera si l'erreur d'origine était que la base de données était en panne. Mais, au cas où vous n'étiez pas au courant, il existe des journaux d'exceptions dans l'admin de ColdFusion que vous pouvez activer pour enregistrer des problèmes de ce type.

Edition - Voici un gestionnaire général en utilisant l'approche cferror: http://www.bennadel.com/blog/932-Ask-Ben-Handling-Errors-With-ColdFusion-CFError.htm

+2

Si vous utilisez application.cfc, vous devez utiliser onError (http://livedocs.adobe.com/coldfusion/8/htmldocs/AppEvents_06.html#1188543), et non cferror.Sinon, c'est comme si vous utilisiez un tournevis pour enfoncer un clou - cela pourrait fonctionner, mais vous n'utilisez pas vos outils correctement. –

+1

Je suis curieux de savoir pourquoi OnError est mieux? Je préfère ne pas l'utiliser car je n'aime pas avoir de sortie html dans mon application.cfc. – Soldarnal

+4

Ce n'est pas "meilleur" en soi, mais c'est le mécanisme de gestion des erreurs associé au framework application.cfc. Considérez cela comme un exercice de rasoir d'occam - les explications les plus simples sont généralement les meilleures. Si vous entendez des sabots, vous penserez "cheval" et non "zèbre". Si un autre développeur voit application.cfc, il pense "onError", pas "cferror". La méthode onError a aussi l'avantage d'être vraiment omniprésente; une erreur qui se produit avant qu'un appel cferror ne soit non géré. D'ici là, vous pouvez tout aussi bien utiliser un cfinclude depuis le corps du gestionnaire onError si vous préférez. –

Questions connexes