Controlando las Excepciones en Microsoft Workflow Foundation.


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.







imagen2
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:







imagen3
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.







imagen5
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)







imagen6
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.







imagen8 
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.







imagen9
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 2: 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(ByVal sender As System.Object, ByVal e As System.EventArgs)
Console.WriteLine(“Estoy Manejando la Excepcion System.IndexOutOfRangeException”)
Console.ReadKey()
End Sub

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







imagen10

Figura 7 – Probando…


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


Saludos,
Gonzalo.

Net Cell, Oportunidad de Desarrollar tu Potencial

netcells

¿En que consiste Net Cell?

Net Cell es una plataforma desarrollada para las comunidades universitarias de Latinoamérica, la cual pretende generar un espacio de difusión y aprendizaje a través de objetivos de estudios. Para esto se deberán conformar células que estarán compuestas por un líder, vice-líder, profesor y miembros.

¿A quién esta dirigido?

Este emprendimiento esta dirigido a estudiantes universitarios de carreras de sistemas y tecnológicas bajo el objetivo común de aprendizaje en el desarrollo de software y la formación profesional en áreas técnicas.

¿Cómo puedo formar parte de una célula?

Podrás formar parte de una célula siendo el líder y designando a los demás miembros de tu propia célula, o bien ingresando a través de la invitación de un líder de una célula. Junto a la invitación recibirás un código de acceso que deberás ingresar cuando te registres.

¿Cómo me registro?

Para poder registrarte deberás ingresar tu cuenta Passport y luego completar o actualizar tus datos en el Formulario de MSDN. Por último, tendrás la opción de ingresar el código de invitación enviada por el líder de la célula, o bien ingresar directamente al sistema para dar de alta tu célula.

Testimonio

Como docente universitario tengo claro que los programas académicos generalemente no se pueden actualizar con la misma rapidez que se actualizan las tecnologías de desarrollo y sus productos asociados, es por ello, que la oportunidad única que brindan las Net Cells, un espacio para profundizar los temas, ponerlos en práctica, exponerlos, debatir sobre los mismos, etc.

Otro aspecto importante es la experiencia que van adquiriendo los integrantes en el sentido de exponer frente a una audiencia sobre un tema específico, aumentando los skills sobre oratoria, como claridad y seguridad entre otros.

Website Microsoft Net Cell 2.0

http://www.mslatam.com/latam/netcell/default.aspx