Colabora |
Manejando Excepciones con Windows Workflow FoundationFecha: 19/Nov/2007 (18/11/2007)
|
IntroducciónSeguramente 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 WorkflowPara 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.
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:
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.
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)
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.
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.
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
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, |
Código de ejemplo (comprimido): |
Fichero con el código de ejemplo: gperez_excepciones_workflow.zip - 9.71 KB
|