5

W poniższym kodzie "Inside catch catch" nigdy nie jest drukowany. Mimo to drukowana jest "ostatnia linia". Dlaczego tak? Proszę pomóż.Dlaczego Task.WaitAny nie zgłasza wyjątku?

Task task1 = Task.Factory.StartNew(() => 
    {     
     throw new Exception("some exception");    
    }); 

    try 
    { 
     Task.WaitAny(new Task[] { task1 }); 
    } 
    catch(Exception e) 
    { 
     Console.WriteLine("Inside catch block."); 
    } 

    Console.WriteLine("Final line."); 
+1

@Servy, myślę, że pytanie nie jest naprawdę taka sama jak istniejący. –

+0

@Servy - inne pytanie było naprawdę inne. Czy możesz usunąć ten duplikat? Głosowałem za ponownym otwarciem tego pytania. – KFL

Odpowiedz

-1
 Task task1 = Task.Factory.StartNew(() => 
     { 
      throw new Exception("some exception"); 
     }) 
     .ContinueWith(task => Console.WriteLine(task.Exception.InnerException.Message), TaskContinuationOptions.OnlyOnFaulted); 

Więc to nie jest to, że nie rzuca wyjątek, to po prostu nie rzuca wyjątek w tym samym wątku jako głównego wątku.

1

To dlatego, że kod wykonywany w innym wątku, ale można złapać wyjątek w innym wątku za pomocą następującego kodu

Task task1 = Task.Factory.StartNew(() => 
     { 
      throw new Exception("some exception"); 
     }); 

     try 
     { 
      task1.Wait(); 
     } 
     catch (AggregateException ex) 
     { 
      Console.WriteLine(ex); 
     } 
+4

Dziękuję Józefowi za odpowiedź. Ale MSDN nie dokumentuje tego specjalnego zachowania metody WaitAny(). Jeśli użyjemy Wait() lub WaitAll(), wówczas blok catch zostanie wykonany, ale nie zostanie wykonany w przypadku WaitAny(). Wątpię, czy Microsoft naprawdę chciał, aby WaitAny() był w ten sposób, czy jest to błąd. –

Powiązane problemy