miércoles, 22 de junio de 2016

Receta Multithreading en C# No. 4-7: Gestión de Excepciones en Tareas

Índice

1. Introducción
2. Palabras Clave
3. Problema
4. Solución
5. Discusión de la Solución
5.1 Excepciones
5.2 AggregateException
6. Práctica: Gestaciones de Excepciones en una Tarea
7. Conclusiones
8. Literatura & Enlaces

1. Introducción

Un proceso en ejecución asincrónica, al igual que un proceso de ejecución en serie, puede dar lugar a excepciones durante su ejecución debido a razones como: error lógico de implementación (bug), operaciones inválidas o no permitidas, agotamiento de recursos, no disponibilidad de recursos de red, etc. Esta receta multithreading en C# se concentra en describir cómo el programador puede ser capaz de gestionar las excepciones generadas durante el tiempo de ejecución de un proceso asincrónico.

2. Palabras Clave

  • Asincronismo
  • Ejecución asincrónica
  • Excepción
  • Sincronismo
  • TPL

3. Problema

Gestionar la generación de excepciones en tiempo de ejecución de una tarea o proceso asincrónico.

4. Solución

Con TPL (Task Parallel Library) el programador puede implementar la gestión de excepciones a través de estos mecanismos: 
  • Enfoque tradicional de manejo de gestiones
  • Consolidación de fallas con AggregateException en múltiples procesos asincrónicos
  • Continuación

5. Solución

5.1 Excepciones

Una discusión detallada acerca de excepciones se haya en esta serie de 5 artículos C#
La excepción AggregateException ("AggregateException Class", 2016) puede concebirse como un contenedor de excepciones generadas durante la ejecución de una operación. Dicho de otra manera, esta excepción se usa para consolidar todas los errores en un único objeto ("AggregateException Class").

En TPL este tipo de excepción es usado ampliamente por facilitar la gestión de las excepciones que se producen durante la ejecución de un operación asincrónica.

6. Práctica: Gestión de Excepciones en una Tarea

A través de este ejemplo el programador comprenderá cómo administrar las excepciones generadas durante la ejecución de una operación asincrónica.

En las líneas 49-63 el método Tarea representa un proceso asincrónico propenso a generación de excepciones: la línea 60 se encarga de generar una excepción intencional para la demostración de la gestión de excepciones.


El método Main realiza las siguientes operaciones: 
  • Líneas 14-26: Aquí se crea una nueva tarea que invoca al método Tarea. Esta tarea se ejecuta de forma sincrónica una vez se invoca al método static Run. La invocación a Tarea genera una excepción que será gestionada en el bloque catch de las líneas 23-26. El tipo implícito de Exception es AggregateException, la cual se ha encargado de consolidar todas las excepciones que pudieron haberse generado durante la invocación de Tarea.
Con las líneas 31 y 32 se crean dos nuevas tareas que serán parte de la tarea compuesta definida en la línea 35Task tareaCompuesta = Task.WhenAll (tarea2, tarea3);.

Estas dos objetos Task -tarea2 y tarea3- conforman a tareaCompuesta. Esta última tiene definida una continuación -líneas 37-39- que responde a las excepciones que genera la ejecución del método Tarea. Debe notarse que el segundo parámetro de ContinueWith es TaskContinuationOptions.OnlyOnFaulted; este valor indica que la continuación debe ejecutarse únicamente en caso de falla (i.e., excepción).

Compilación: 

csc /t:exe GestionExcepcionesTarea.cs

Ejecución assembly

.\GestionExcepcionesTarea.exe

> Prueba de ejecución (ideone.com): http://ideone.com/MOQB7j

> Prueba de ejecución (local): 
Ejecución assembly GestionExcepcionesTarea.exe
Animación 1. Ejecución assembly GestionExcepcionesTarea.exe.

7. Conclusiones

El manejo o gestión de excepciones en procesos de ejecución asincrónica se ha demostrado usando elementos de programa del modelo TPL. Este modelo de implementación permite escribir aplicaciones robustas atendiendo a las fallas que pudiera generar la ejecución de procesos paralelos.

La próxima receta multithreading enseñará al programador C# a ejecutar tareas en modo paralelo.

8. Literatura & Enlaces

Agafonov, E. (2013). Multithreading in C# 5.0 Cookbook. United States: Packt Publishing.
Excepciones en C#: Introducción a las Excepciones (2016, junio 22). Recuperado desde: http://ortizol.blogspot.com.co/2014/06/excepciones-en-csharp-parte-1-introduccion-a-las-excepciones.html
Excepciones en C#: Uso de Excepciones (2016, junio 22). Recuperado desde: http://ortizol.blogspot.com.co/2014/07/excepciones-en-csharp-parte-2-uso-de-excepciones.html
Excepciones en C#: Diseño de Excepciones Personalizadas (2016, junio 22). Recuperado desde: http://ortizol.blogspot.com.co/2014/07/excepciones-en-csharp-parte-3-diseno-de-excepciones-personalizadas.html
Excepciones en C#: Propiedades de la Clase Base System.Exception (2016, junio 22). Recuperado desde: http://ortizol.blogspot.com.co/2014/07/excepciones-en-csharp-parte-4-propiedades-de-la-clase-base-system.exception.html
Excepciones en C#: Ejemplos de Excepciones Comunes (2016, junio 22). Recuperado desde: http://ortizol.blogspot.com.co/2014/07/excepciones-en-csharp-parte-5-ejemplos-de-excepciones-comunes.html
AggregateException Class (System) (2016, junio 22) Recuperado desde: https://msdn.microsoft.com/en-us/library/system.aggregateexception(v=vs.110).aspx


V

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.