Dans .NET 4 et au-dessus, vous pouvez utiliser Task<T>
de la classe au lieu de créer un nouveau thread. Ensuite, vous pouvez obtenir des exceptions à l'aide .Exceptions
propriété de l'objet tâche.
Il y a 2 façons de le faire:
1 - dans des locaux séparés de la méthode: // traiter l'exception de certaines tâches du thread
class Program
{
static void Main(string[] args)
{
Task<int> task = new Task<int>(Test);
task.ContinueWith(ExceptionHandler, TaskContinuationOptions.OnlyOnFaulted);
task.Start();
Console.ReadLine();
}
static int Test()
{
throw new Exception();
}
static void ExceptionHandler(Task<int> task)
{
var exception = task.Exception;
Console.WriteLine(exception);
}
}
2 - dans la même méthode: // traiter l'exception de l' appelant fil
class Program
{
static void Main(string[] args)
{
Task<int> task = new Task<int>(Test);
task.Start();
try
{
task.Wait();
}
catch (AggregateException ex)
{
Console.WriteLine(ex);
}
Console.ReadLine();
}
static int Test()
{
throw new Exception();
}
}
Notez que l'exception que vous obtenez est AggregateException. Tous les immobiliers d'exception sont disponibles par le biais ex.InnerExceptions
de la propriété.
Dans .NET 3.5 , vous pouvez utiliser le code suivant: // traiter l'exception de l' enfant thread
class Program
{
static void Main(string[] args)
{
Exception exception = null;
Thread thread = new Thread(() => SafeExecute(() => Test(0, 0), Handler));
thread.Start();
Console.ReadLine();
}
private static void Handler(Exception exception)
{
Console.WriteLine(exception);
}
private static void SafeExecute(Action test, Action<Exception> handler)
{
try
{
Test();
}
catch (Exception ex)
{
Handler(ex);
}
}
static void Test(int a, int b)
{
throw new Exception();
}
}
Ou // Vous d'exception en l' appelant fil
class Program
{
static void Main(string[] args)
{
Exception exception = null;
Thread thread = new Thread(() => SafeExecute(() => Test(0, 0), out exception));
thread.Start();
thread.Join();
Console.WriteLine(exception);
Console.ReadLine();
}
private static void SafeExecute(Action test, out Exception exception)
{
exception = null;
try
{
Test();
}
catch (Exception ex)
{
exception = ex;
}
}
static void Test(int a, int b)
{
throw new Exception();
}
}