Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese
Informazioni
L'argomento richiesto è visualizzato di seguito, ma non è incluso in questa libreria.
We recommend using Visual Studio 2017

Procedura: gestire le eccezioni generate dalle attività

.NET Framework (current version)

Gli esempi seguenti illustrano come gestire le eccezioni generate da una o più attività.

In questo primo esempio viene prima rilevato l'oggetto System.AggregateException e quindi ne viene esaminata la proprietà InnerExceptions per verificare se contiene eccezioni gestibili dal codice del programma.


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


In questo esempio viene rilevato l'oggettoSystem.AggregateException ma non viene eseguito alcun tentativo di gestione delle eccezioni interne. Viene invece impiegato il metodo Flatten per estrarre le eccezioni interne dalle istanze di AggregateException annidate e rigenerare una sola eccezione AggregateException che contiene direttamente tutte le eccezioni interne non gestite. L'applicazione del metodo Flatten semplifica la gestione dell'eccezione da parte del codice 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.");
}


Per eseguire questo esempio, incollare il codice nell'esempio precedente e chiamare RethrowAllExceptionss dal metodo Main.

Mostra: