Para ver el artículo en inglés, active la casilla Inglés. También puede ver el texto en inglés en una ventana emergente si pasa el puntero del mouse por el texto.
Traducción
Inglés
Información
El tema que ha solicitado se muestra abajo. Sin embargo, este tema no se encuentra en la biblioteca.
Se recomienda usar Visual Studio 2017

Cómo: Controlar excepciones iniciadas por tareas

.NET Framework (current version)

Los ejemplos siguientes muestran cómo controlar las excepciones producidas por una o varias tareas.

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


using System;
using System.Threading.Tasks;

public class Example
{
    public static void Main()
    {
        HandleExceptions();
        // RethrowAllExceptions();
        Console.Write("Press any key.");
        Console.ReadKey();
    }

    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 el ejemplo siguiente, 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.

Mostrar: