Exportar (0) Imprimir
Expandir todo
Este artículo proviene de un motor de traducción automática. Mueva el puntero sobre las frases del artículo para ver el texto original. Más información.
Traducción
Original

Cómo: Controlar excepciones iniciadas por tareas

En los siguientes ejemplos, se muestra cómo controlar las excepciones producidas en una o varias tareas.

En este primer ejemplo, se detecta la excepción System.AggregateException y, a continuación, se examina su propiedad InnerExceptions para determinar si algunas de las excepciones se pueden controlar mediante el código del programa.



static string[] GetAllFiles(string str)
{
    // Should throw an AccessDenied exception on Vista.
    return System.IO.Directory.GetFiles(str, "*.txt", System.IO.SearchOption.AllDirectories);
}
static void HandleExceptions()
{
    // Assume this is a user-entered string.
    string path = @"C:\";

    // Use this line to throw UnauthorizedAccessException, which we handle.
    Task<string[]> task1 = Task<string[]>.Factory.StartNew(() => GetAllFiles(path));

    // Use this line to throw an exception that is not handled.
    //  Task task1 = Task.Factory.StartNew(() => { throw new IndexOutOfRangeException(); } );
    try
    {
        task1.Wait();
    }
    catch (AggregateException ae)
    {

        ae.Handle((x) =>
        {
            if (x is UnauthorizedAccessException) // This we know how to handle.
            {
                Console.WriteLine("You do not have permission to access all folders in this path.");
                Console.WriteLine("See your network administrator or try another path.");
                return true;
            }
            return false; // Let anything else stop the application.
        });

    }

    Console.WriteLine("task1 has completed.");
}


En este ejemplo, se detecta la excepción System.AggregateException, pero no se intenta controlar ninguna de sus excepciones internas. En su lugar, se utiliza el método Flatten para extraer las excepciones internas de todas las instancias anidadas de AggregateException y volver a iniciar una sola excepción AggregateException que contiene directamente todas las excepciones internas no controladas. Al reducir la excepción, resulta más fácil controlarla mediante código de cliente.


static string[] GetValidExtensions(string path)
{
    if (path == @"C:\")
        throw new ArgumentException("The system root is not a valid path.");

    return new string[10];
}
static void RethrowAllExceptions()
{
    // Assume this is a user-entered string.
    string path = @"C:\";


    Task<string[]>[] tasks = new Task<string[]>[3];
    tasks[0] = Task<string[]>.Factory.StartNew(() => GetAllFiles(path));
    tasks[1] = Task<string[]>.Factory.StartNew(() => GetValidExtensions(path));
    tasks[2] = Task<string[]>.Factory.StartNew(() => new string[10]);


    //int index = Task.WaitAny(tasks2);
    //double d = tasks2[index].Result;
    try
    {
        Task.WaitAll(tasks);
    }
    catch (AggregateException ae)
    {
        throw ae.Flatten();
    }

    Console.WriteLine("task1 has completed.");
}


Para ejecutar este ejemplo, pegue el código en el ejemplo anterior y llame a RethrowAllExceptions desde el método Main.

Adiciones de comunidad

AGREGAR
Mostrar:
© 2014 Microsoft