Faut Handlers

Gestion des erreurs dans un workflow séquentiel

22/12/2009 1599 lectures 0 commentaire 4.5/5 (2 votes)
La partie la plus importante d'un workflow séquentiel est bien évidemment le scénario principal. Cependant, il ne faut pas négliger le scénario d'erreur. Effectivement, un workflow est susceptible d'exécuter des lignes de codes qui généreront une erreur selon le contexte, il est donc très important de savoir intercepter ces erreurs.

Dans ce cours, nous allons voir comment réagir face à une exception lancée par votre workflow. Pour cela, nous allons développer un workflow séquentiel très simple qui va générer plusieurs exceptions différentes. Ouvrez donc Visual Studio et créez un projet de type Sequential Workflow que vous appellerez MyWorkflowInError.

Image


Nous allons attacher automatiquement ce workflow à une simple liste générique que nous n'aurons pas personnalisée. Une fois que vous avez validé la création du workflow, supprimez le fichier workflow1.cs, cliquez avec le bouton droit de votre souris sur votre projet, choisissez Add > New Item > Sequential Workflow (Code) et nommez-le TheWorkflow.

Image


Ouvrez ensuite le fichier workflow.xml et modifiez l'attribut CodeBesideClass avec la valeur MyWorkflowInError.TheWorkflow. Au final, votre fichier (sans les commentaires) devrait ressembler à ceci :



Placez tout d'abord une activité OnWorkflowActivated que vous nommerez onWorkflowActivated. Modifiez sa propriété CorrelationToken sur workflowToken et choisissez TheWorkflow comme OwnerActivityName. Créez également une propriété nommée WorkflowProperties pour la propriété WorkflowProperties.

Glissez ensuite une activité Code (groupe Windows Workflow v3.0) en dessous de l'activité onWorkflowActivated. Nommez cette activité codeError et double-cliquez dessus. Votre workflow devrait normalement ressembler à ceci :

Image


Rendez-vous maintenant dans la fonction codeError_ExecuteCode qui a été automatiquement implémentée par le designer et tapez-y le code suivant :



Ce code va simplement nous permettre de lancer 3 exceptions différentes. Nous récupérons d'abord le titre de l'élément ayant déclenché l'exécution du workflow pour tester différentes valeurs. Si ce titre vaut "1", nous essayons d'appeler une fonction sur un objet contenant null. Si la valeur du titre vaut "2", nous essayons de convertir le texte "Error" en nombre. Et enfin, si le titre vaut "3", nous essayons d'accéder à un élément inexistant d'un tableau. Ces 3 bouts de code vont lancer des exceptions différentes. Nous allons donc voir comment les gérer.

Revenez sur le designer, placez votre curseur sur la flèche blanche sur fond vert et déroulez le menu. Choisissez alors View Fault Handlers :

Image


L'écran qui apparaît va vous permettre de gérer les scénarii d'erreurs de votre workflow. Le principe est assez simple. Actuellement, une seule activité se trouve dans votre scénario d'erreur et est du type FaultHandlers. Le rôle de cette activité va être de contenir une ou plusieurs activités FaultHandler (sans le "s" final). Chaque activité de ce type va être responsable de l'interception d'un type d'exception et va donc exécuter des instructions (ou des activités) pour chaque type d'erreur gérée. Cliquez donc sur la seule activité présente et renommez-la en faultHandlers.

Image


Comme cette activité l'indique, nous allons maintenant devoir ajouter une ou plusieurs activité du type FaultHandler. En fait, il va falloir imaginer cela comme une suite de try ... catch. L'ordre à donc de l'importance. Effectivement, quand vous faites un try ... catch, vous ne devez pas intercepter System.Exception avant d'intercepter System.NullReferenceException par exemple. Effectivement sinon, le try ... catch interceptant System.NullReferenceException ne sera jamais exécuté vu que le try ... catch de System.Exception attrapera toutes les exceptions.

Placez donc un FaultHandler que vous nommerez NullExceptionHandler. La propriété FaultType va vous permettre de définir le nom de l'exception a gérer. Tapez donc System.NullReferenceException ou allez chercher cette exception en cliquant sur les 3 petits points en face de la propriété :

Image


Pour cette première erreur, nous allons simplement afficher un message dans l'historique du workflow en indiquant qu'une erreur s'est produite. Glissez donc une activité LogToHistoryListActivity dans le FaultHandler NullExceptionHandler. Nommez cette activité logNullException et tapez "Une erreur est survenue durant le workflow. Une fonction a été appelée sur un objet null" dans la propriété HistoryDescription.

Image


Nous allons maintenant passer à la deuxième exception qui peut être générée par notre workflow. Ajoutez donc simplement un deuxième FaultHandler dans le FaultHandlers et nommez-le ParseExceptionHandler. Cette fois, vous devrez modifier sa propriété FaultType sur System.FormatException.

Pour cette erreur, en plus d'afficher un message d'erreur dans la l'historique du workflow, nous allons également afficher le stack trace de l'erreur. Insérez donc tout d'abord une activité LogToHistoryListActivity que vous nommerez logParseException. Cette fois, nous n'allons pas taper directement la valeur de la description de l'élément dans la propriété HistoryDescription. Effectivement, nous allons créer une propriété pour HistoryDescription et nous l'initialiserons via le code. Cliquez donc sur les trois petits points de la propriété HistoryDescription et créez une nouvelle propriété que vous nommerez ParseExceptionDescription. Modifiez ensuite la propriété MethodInvoking sur ParseExceptionMethod. Cette méthode va être appelée par l'activité logParseException pour initialiser la description du message. Tapez alors ceci dans le corps de cette fonction :



Cette ligne va simplement permettre d'initialiser la valeur de la description dans l'historique. Vous voyez que nous pouvons facilement accéder à l'exception en utilisant l'objet Fault du FaultHandler interceptant l'erreur.

Passons maintenant à la troisième erreur. Déposez donc un dernier FaultHandler dans le FaultHandlers, nommez-le AllExceptionHandler et définissez sa propriété FaultType sur System.Exception. Placez ensuite une activité Code dans cet handler que vous nommerez ThrowAllExceptionCode. Double-cliquez dessus et tapez simplement :



Ce code va simplement permettre de relancer l'erreur à SharePoint pour que ce soit lui qui la gère. Au final, votre scénario d'erreur devrait ressembler à ceci :

Image


Déployez votre workflow pour le tester. Allez donc dans la liste WF et créez un élément avec comme titre "1". Dans la liste, le statut du workflow sera sur Completed. Si vous cliquez sur ce statut, vous verrez ceci dans l'historique :

Image


L'exception System.NullReferenceException est bien interceptée et le message est inséré dans l'historique du workflow. Créez ensuite un élément dans le titre vaut "2". Encore une fois, le statut du workflow sera Completed mais l'historique ressemblera à ceci :

Image


Le stack trace de l'erreur est bien récupéré et affiché. Ajoutez enfin un élément avec "3" comme titre. Cette fois, le statut du workflow sera "Error Occured" car l'exception aura été relancée à SharePoint. Si vous cliquez sur ce status, l'historique de description contiendra cette entrée :

Image


L'erreur est donc bien relancée à l'application.

Télécharger les sources de l'exemple

Voter :

0 commentaires

Ajouter un commentaire