Pour afficher l’article en anglais, activez la case d’option Anglais. Vous pouvez aussi afficher la version anglaise dans une fenêtre contextuelle en faisant glisser le pointeur de la souris sur le texte.
Traduction
Anglais

Comment : gérer les exceptions levées par des tâches

.NET Framework (current version)

Les exemples suivants montrent comment gérer les exceptions levées à partir d'une ou plusieurs tâches.

Dans l'exemple suivant, l'exception System.AggregateException est interceptée, puis sa propriété InnerExceptions est examinée pour déterminer s'il existe des exceptions pouvant être gérées par notre code de programme.


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.");
   }
}


Dans l'exemple suivant, l'exception System.AggregateException est interceptée, mais aucune tentative n'est faite pour gérer ses exceptions internes. Au lieu de cela, la méthode Flatten est utilisée pour extraire les exceptions internes de toutes les instances AggregateException imbriquées et lever à nouveau une seule AggregateException qui contient directement toutes les exceptions internes non gérées. L'aplanissement de l'exception facilite la gestion du code client.


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.");
}


Pour exécuter cet exemple, collez le code dans l'exemple précédent et appelez RethrowAllExceptions à partir de la méthode Main.

Afficher: