Capturar errores en orquestaciones de BizTalk Server 2004/2006/2006 R2: "General Exception" vs "System.Exception"

Si eres un programador de orquestaciones de BizTalk Server seguro que en ocasiones has tenido que capturar excepciones generales ¿no? A modo de repaso, en este post me gustaría compartir con vosotr@s las opciones existentes.

Antes de todo tenemos que crear en nuestra orquestración el típico Try/Catch pero ¿como se hace? sencillo solo tenemos que arrastrar la forma (Shape) llamada "Scope", este delimita el área que queremos aislar de errores, es decir nuestro Try{...} . Ahora faltaría el área para capturar el o los errores  Catch{...} , para ello sobre el icono {} hay que hacer un click con el botón derecho y seleccionar la opción "New Exception Handler", vereís como se ha añadido debajo un bloque llamado "CatchException_1". A continuación en la ventana de propiedades del nuevo elemento añadido, el editor nos pide que seleccionamos las siguientes propiedades:

  • "Exception Object Name", donde hay que indicar el nombre que utiliceremos para referirnos al objeto con la información del error producido, en otras palabras nuestras instancia
  • "Exception Object Type", que como se puede imaginar sería el tipo de excepción a capturar. Las opciones son muy variadas,  desde una excepción de .NET (System.Security.AuthenticationException o nuestra clase de excepción creada a medida) a una excepción propia de BizTalk, "General Exception"

Por supuesto, podemos incluir todos los bloques para capturar los tipos de excepciones que queramos, la única condición es que cada tipo sea diferente. 

Como veis los pasos son muy sencillos, aunque posiblemente os rondará la siguiente pregunta ¿A que se debe el título de este post? ;) veamos esto a continuación.

El cometido del tipo de excepción "General Exception" es similar a "System.Exception", es decir capturar TODAS las excepciones que se produzcan que no hayan sido capturadas previamente. Este tipo esta diseñado para ser utilizado en escenarios que requieran que la gestión del error se realice fuera del alcance de nuestro bloque Try/Catch,ya sea en nuestra orquestración o fuera de ella (por ejemplo, en la orquestación que la ha llamado), esto se realiza con la forma "Throw Exception" y seleccionado el objeto de excepción a lanzar.

En ocasiones se hace necesario acceder al contenido de la excepción antes de delegar la gestión de errores, por ejemplo para registrar en el sistema de trazas (o logs) de la aplicación el mensaje del error o su código. Esta funcionalidad (obtener información de la excepción) no puede ser realizada utilizando el tipo "General Exception" dado que no se dispone del nombre del objeto, entonces ¿Cómo lo hago? lo primero que le viene a la cabeza al programador es "Sencillo, solo tengo que seleccionar como tipo de excepción a la clase System.Exception y listo" pero cuando seleccionas la opción " <.NET Exception> " y buscas en la ventana "Select Artifact Type" dicho tipo de exceptión te sorprendes porque no encuentras el ansiado "System.Exception", por lo que decides tomarte un cáfe dado que piensas que estas dormido o dormida, pero al volver te das cuentas que ni por esas lo encuentras :((( entonces, volvemos a la pregunta inicial ¿Cómo .... lo hago? La práctica recomendada es crear un objeto a medida que herede de System.Exception y por tanto lo puedas utilizar para este escenario :)

 No obstante, algunos clientes y asistentes a los workshop o cursos que doy, se sorprenden cuando ven en mis orquestaciones que tengo seleccionado como tipo de objeto "System.Exception" y me preguntan ¿Cómo lo haces??? ¿Si no se puede? La verdad es que no tiene mucho secreto, aunque no se si es una práctica recomenda y/o soportada por Microsoft, os digo los pasos que sigo (*) :

  1. Creo un nuevo bloque "Exception Handler" o Catch
  2. Selecciono cualquier tipo de excepcion de la lista " <.NET Exception> "
  3. Guardo mi orquestación
  4. Desde el explorador de soluciones de Visual Studio me posiciono en el fichero de orquestación, botón derecho click, opción "Open With... " y en la ventana emergente selecciono "XML Editor
  5. Busco el bloque creado y cambio manualmente el tipo de excepción que previamente seleccione por "System.Exception"
  6. Guardo confirmando los cambios y cierro el editor de XML
  7. Después abro la orquestación de la forma habitual y listo, ya tengo un objeto "System.Exception" que puedo referenciar en mi código :)

:)))

(*) Recuerda que esta práctica se entrega "tal ycomo esta", por tanto no me hago responsable (ni la empresa en que trabajo) ni doy soporte sobre su utilización.

¡Un ejemplo! Si hubiese seleccionado como tipo de excepción "General Exception" al abrir con el editor de XML la orquestación tendría: 

<om:Property Name="ExceptionType" Value="General Exception" />

Por tanto lo sustituiría por:

<om:Property Name="ExceptionType" Value="System.Exception" />

<

om:Property Name="ExceptionName" Value="e" />

Espero que os haya gustado el artículo y que os pueda ayudar en un futuro.