Comment gérer correctement une exception dans une Tâche avec ContinueWith
Après la lecture d'informations sur la tâche et exepcion de gestion, je suis en utilisant ce code pour gérer une exception est levée dans une Tâche:
Task<Object> myTask = Task.Factory.StartNew<Object>(doTask, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default);
myTask .ContinueWith(task => afterTask(task), TaskScheduler.FromCurrentSynchronizationContext());
Où doTask et AfterTask sont:
private <Object> doTask() {
throw new Exception("BOOM");
}
private afterTask(Task<Object> aTask) {
if (aTask.IsFaulted)
{
MessageBox.Show(aTask.Exception.InnerException.Message);
}
else //whatever
}
Lorsque Exception Boom est lancé le Visual Studio affiche une alerte informant qu'une exception n'a pas été pris, mais si je continue d'exécuter l'exception est traitée dans le afterTask fonction.
Est ce code correct ou-je missunderstood de base du comportement de la tâche? Il n'y a aucun moyen d'éviter l'alerte à partir du débogueur que l'exception n'a pas été pris? C'est un peu gênant...
Merci d'avance
OriginalL'auteur Ivan BASART | 2013-09-17
Vous devez vous connecter pour publier un commentaire.
Essayez plutôt ceci:
À l'aide de la
TaskContinuationOptions.OnlyOnFaulted
, vous exécutez votreContinueWith
ne bloquer que si une exception est levée par la tâche d'origine.Aditionally, vous pouvez choisir de retourner true ou false à partir de la lambda passé à
Handle
, indiquant si l'exception a été manipulé ou non. Dans mon cas, je ne veux pas arrêter l'exception de la multiplication. Vous souhaiterez peut-être modifier un retourtrue
dans votre cas.Dans visual studio Debug->Exceptions-> décocher commonlanguageruntimeexceptions jeté case cliquez sur ok
Le principal avantage est le fait que le
ContinueWith
tâche sera exécuté uniquement lorsqu'une exception est levée. Dans l'exemple que vous avez posté, la tâche devrait toujours être exécuté. Le deuxième avantage est la lisibilité. Pour prévenir ces VS fenêtres pop-up, je vais essayer ceci: stackoverflow.com/questions/2173997/...OriginalL'auteur dcastro
OriginalL'auteur Tim Dinh