Yohan Jasdid's

Codes & *Stories ..

Posts in the category

Trabajando en un proyecto y de alguna manera llegue a ver el escenario que a continuacion describo al momento de utilizar el operaror yield y manejo de excepciones con PostSharp..

Resulta que cuando utilizas yield para regresar una lista tipo IEnumerable y en el metodo hijo en el cual utilizas yield ocurre una exception hay un comportamiento un tanto raro o al menos para mi que no soy un experto en C#, quise hacer un proyecto de ejemplo para ilustrar mejor el comportamiento que describo, a continuacion pongo la clase de un proyecto de consola que hice:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace PostSharpYieldSample
{
    public class Program
    {
        public static void Main(string[] args)
        {
            ParentMethod();
            Console.WriteLine("press any key to end.");
            Console.ReadLine();
        }

        private static IEnumerable<string> _myList;

        /// <summary>
        /// Parent
        /// </summary>
        [ExceptionHandlerAspect]
        public static void ParentMethod()
        {
            Console.WriteLine("In parent Method.");
            _myList = ChildYieldMethod();

            // comment the lines below to "EAT" the exception message
            foreach (string str in _myList)
                Console.Write(str);
        }

        /// <summary>
        /// Child method using yield
        /// </summary>
        /// <returns></returns>
        public static IEnumerable<string> ChildYieldMethod()
        {
            Console.WriteLine("In child Method.");
            String[] data = { "Item 1", "Item 2", "Item 3" };

            foreach (string myString in data)
            {
                yield return myString;
                throw new Exception("Some exception happen here");
            }
        }
    }
}

Como se puede ver estoy utilizando un Aspecto de PostSharp en el metodo ParentMethod() para “cachar” todas las excepciones que pudieran ocurrir en el metodo, a continuacion enlisto el aspecto que estoy utilizando:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PostSharp.Aspects;
using System.Diagnostics;

namespace PostSharpYieldSample
{
    /// <summary>
    /// Aspect class that handles errors using postsharp
    /// </summary>
    [Serializable]
    public sealed class ExceptionHandlerAspect : OnExceptionAspect
    {
        /// <summary>
        /// The flow behavior to use.
        /// </summary>
        private FlowBehavior flowBehavior;

        /// <summary>
        /// Default Constructor
        /// </summary>
        public ExceptionHandlerAspect()
            : this(FlowBehavior.Return)
        {
        }

        /// <summary>
        /// Creates an instance specifying the flow behavior to use
        /// </summary>
        /// <param name="flowBehavior">The flow behavior</param>
        public ExceptionHandlerAspect(FlowBehavior flowBehavior)
        {
            this.flowBehavior = flowBehavior;
        }

        /// <summary>
        /// Method invoked upon failure of the method to which the current
        /// aspect is applied.
        /// </summary>
        /// <param name="args">Information about the method being executed.</param>
        public override void OnException(MethodExecutionArgs args)
        {
            string errorInfo = string.Format("{0}() {1} - PostSharp message.", args.Method.Name, args.Exception.Message);
            Console.WriteLine(errorInfo);
            args.FlowBehavior = flowBehavior;
        }

    }
}

Este aspecto es muy sencillo y lo utilice solo para fines de la demostracion y lo unico que hace es que me regresa un mensaje personalizado de la excepcion que ocurrio en el metodo donde se definio el aspecto (atributo), al ejecutar la aplicacion de ejemplo se vera la siguiente pantalla:

Cosa que tiene sentido ya que el flujo del programa entro en el metodo donde utilizo yield y solo regreso el primer elemento para despues lanzar la excepcion especificada, en este caso PostSharp “atrapa” correctamente la excepcion y la muestra en pantalla, este es el comportamiennto esperado, El problema viene cuando comentamos las lineas del parent method donde se hace referencia a la lista que se lleno mediante yield, estas lineas comentadas son las siguientes:

            // comment the lines below to "EAT" the exception message
            //foreach (string str in _myList)
            //    Console.Write(str);

Al momento de comentar estas lineas y volver a ejecutar el programa algo “raro” ocurre con la excepcion, lo que ocurre es que practicamente la excepcion es omitida o practicamente nuca llegamos a ejecutar el metodo donde utilizamos yield, el resultado luciria algo como lo siguiente:

Habra que investigar mas sobre lo que la palabra reservada yield hace en este caso internamente ya que a mi punto de vista no es un comportamiento obvio al que uno concluiria facilmente, a continuacion pongo el enlace del codigo fuente de la aplicacion ejemplo..

PostSharpYieldSample

Pd. Creo que se me olvido hablar un poco mas acerca de PostSharp y programacion orientada a aspectos, es buen tema para un post que publicare mas adelante en estos dias por si te interesa saber mas sobre el tema de todos modos en la red hay mucha informacion sobre ello..

Saludos! :)

Post to Twitter Post to Delicious Post to Facebook Send Gmail

Stuxnet: Como infecta PLC’s (Video)

Navegando por internet y buscando algo mas de informacion sobre Stuxnet el virus mas avanzado de la historia, me encontre con un video que recientemente libero Symantec en donde se demuestra la manera en que Stuxnet infecta PLC’s,

Cabe mencionar que el documento que en un pasado post publique aqui en el blog y propiedad de Symantec ha cambiado ya que se han descubierto nuevas funcionalidades de Stuxnet en la parte de la reprogramacion de los PLC’s al parecer altera frecuencias de salida utilizando convertidores, lo que resultaria en el aumento o disminucion de la velocidad de un motor y se traduce en efectos impredecibles dependiendo de la programacion del PLC infectado,

Aqui esta el enlace del articulo completo donde se describe la nueva funcionalidad asi como el documento actualizado de Stuxnet el cual lo subire para que este disponible en todo momento en el blog, tambien dejo el enlace al documento original.

httpv://www.youtube.com/watch?v=cf0jlzVCyOI

w32_stuxnet_dossier.pdf

Saludos! :)

Post to Twitter Post to Delicious Post to Facebook Send Gmail

Este mega-fast post jejej es solo para hacer una recomendacion, si tu eres un heavy user de Visual Studio 2010 este es una extension must-have, ya que como su nombre lo dice hace que tu productividad al momento del desarrollo aumente con unas increibles mejoras hechas al entorno de desarrollo, para ver una descripcion detallada de todo lo que se incluye con los power tools CLICK AQUI..

A continuacion agrego algunos screenshots para que te quedes boqui abierto,, felicidades a la gente de Microsoft que no deja de sorprender con las increibles herramientas de desarrollo que pone a nuestra disposicion!!

Post to Twitter Post to Delicious Post to Facebook Send Gmail

Celebrando..

Quiero externar un agradecimiento especial a la familia de mi Novia y Amigos que me invitaron a celebrar con una comida y unos juegos de Ajedrez mi defensa de tesis de Maestria :)

Me la pase excelente! aunque todavia no he podido ganarle a Manzanares en Ajedrez pero no dejare de intentar jejej,

Saludos!

Post to Twitter Post to Delicious Post to Facebook Send Gmail