Colabora
 

Manejando Excepciones con Windows Workflow Foundation

Fecha: 19/Nov/2007 (18/11/2007)
Autor: Gonzalo Pérez - chalalo@hotmail.com

http://geeks.ms/blogs/gperez

 


Introducción

Seguramente ya has escuchado sobre WWF (ya me imagino que sabes que no estoy hablando de Hulk Hogan), más bien, sobre la nueva visión sobre el modelado de procesos de negocios de Microsoft expuesto a través de .NET Framework 3.0. En este artículo no vamos a revisar los conceptos fundamentales de WWF, más bien vamos a revisar como podemos administrar las excepciones ocurridas dentro de una actividad de un Workflow.

La forma que veremos en este articulo, será agregar actividades tipo manejadores de excepciones (FaultHandler) al todo el WF, ya que también es posible ( y seguramente más conveniente en algunos casos) agregar  FaultHandler para las actividades Sequence (actividades compuestas).

 

Diseñando el Workflow

Para este ejemplo, utilizaremos el template Secuential WorkFlow Console Application, de tal manera de tener un workflow de ejecución secuencial y que podamos imprimir los resultados de la ejecución por consola.

 


Básicamente tenemos el siguiente WF.

Workflow
Figura 1 - Diseño del Workflow

En Donde el código programático asociado a esto es:

Public class Workflow1
Inherits SequentialWorkflowActivity
     Dim VectorA() As Integer = {3, 4, 1}

    Private Sub Actividad1_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Console.WriteLine("Actividad 1: Iniciando WF")
        Console.ReadKey()
     End Sub

    Private Sub Actividad2_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Console.WriteLine("Actividad 2: Imprimiendo VectorA")
        Dim i As Integer = 0
        For i = 0 To 2 Step 1
            Console.WriteLine(VectorA(i))
        Next
      Console.ReadKey()
   End Sub

    Private Sub Actividad3_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Console.WriteLine("Actividad 3:Fin de WF")
        Console.ReadKey()
    End Sub
End Class

Al ejecutar el programa esto funciona sin problemas arrojando el siguiente resultado:

Figura 2 - Probando...

Hasta ahora bien, ¿Pero que sucedería si hacemos el for hasta un valor que este fuera del rango del índice del VectorA?, Sucedería que se levantaría una excepción no manejada, y se mostrará el mensaje de la excepción debido a que el template que estamos utilizando utiliza el siguiente código para imprimir el mensaje.

Shared Sub OnWorkflowTerminated(ByVal sender As Object, ByVal e As WorkflowTerminatedEventArgs)
    Console.WriteLine(e.Exception.Message)
    WaitHandle.Set()
End Sub

Obviamente surge la necesidad de poder controlar estas excepciones, y es aquí cuando entra la Vista de "View Fault Handlers", la cual nos permitirá agregar las actividades FaultHandlers correspondientes para manejarlas.

Figura 3- View Fault Handlers

  Una vez que se a seleccionado la Vista de Fault Handlers, podremos ver las opciones disponibles, en donde podremos arrastrar las FaultHandlersActivity  y también las actividades asociadas a ese manejador de excepción FaultHandlerActivity.(Si pensabas que eran lo mismo, fíjate que la primera el plural y la segunda singular, jejjeje, no es solo cosa del lenguaje, es que es la actividad asociada a un manejador específico)

Figura 4 - Agregando FaultHandlersActivity 

Arrastramos las actividades en los sectores correspondientes y vamos a tener algo como en la figura 5. Ahora tenemos que setear el FaulType de cada FaultHandlersActivity, según el tipo de excepciones que queramos controlar. Esto es como los bloques Try-Catch, en donde vamos agregando Catch según los tipos de excepciones que estamos manejando. Esto quiere decir, que por cada FaultHandlersActivity, podemos tener uno o más FaultHandlerActivity(ActManejoErr1 en la figura 5) que manejen la excepción configurada en el FaulType.

 
Figura 5 - Agregando más de un  FaultHandlersActivity  y el correspondiente FaultHandlerActivity(ActManejoErr1)

Si no te acuerdas del nombre completo de la excepción que vas a manejar, puedes browsear y seleccionar el tipo derivado de System. Exception, como te decía antes, busca la excepción que vas a manejar.

Figura 6 - Explorando y Seleccionando el tipo derivado de System. Exception

Lo anterior lo debes realizar para cada uno de los  FaultHandlersActivity. Una vez que ya agregamos las actividades que van a manejar las excepciones.(muy bueno!).

Ahora bien, vamos a generar excepciones recorriendo el arreglo fuera de los índices del mismo, y por otra parte, haciendo un casting inválido, en el caso que ejecutemos la aplicación con el nuevo código, te darás cuenta que la primera excepción es la que se levanta y captura, escribí la segunda excepción  VectorA(1) = CInt("hola"), para probar más de un FaultHandlersActivity.

Option Strict On
Public Class Workflow1
    Inherits SequentialWorkflowActivity
    Dim VectorA() As Integer = {3, 4, 1}

    Private Sub Actividad1_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Console.WriteLine("Actividad 1: Iniciando WF")
        Console.ReadKey()
    End Sub

    Private Sub Actividad2_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Console.WriteLine("Actividad 1: Imprimiendo VectorA")

        Dim i As Integer = 0
        For i = 0 To 3 Step 1
            Console.WriteLine(VectorA(i))
        Next
        VectorA(1) = CInt("hola")
        Console.ReadKey()
    End Sub

    Private Sub Actividad3_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Console.WriteLine("Actividad 3:Fin de WF")
        Console.ReadKey()
    End Sub

    Private Sub ActManejoErr1_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Console.WriteLine("Estoy Manejando la Excepcion System.IndexOutOfRangeException")
        Console.ReadKey()
    End Sub

    Private Sub ActManejoErr1_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Console.WriteLine("Estoy Manejando la Excepcion System.InvalidCastException")
        Console.ReadKey()
    End Sub
End Class

 

Figura 7 - Probando...

 

Como ves,  funciona y es bastante sencillo, puedes probar agregando más manejadores de excepciones en tu aplicación, así que a seguir probando :).

Saludos,
Gonzalo.



Código de ejemplo (comprimido):

 

Fichero con el código de ejemplo: gperez_excepciones_workflow.zip - 9.71 KB

(MD5 checksum: CAE1D90113B1CAA3B9852CB87319B998

 


Ir al índice principal de el Guille