2016-12-02 6 views
-1

Ich versuche, eine Ausnahme durch eine Methode (GetMoreCodes) ausgelöst durch eine Task ausgelöst, aber beim Debuggen der Ausnahme wird nie behandelt und der catch-Block wird nie getroffen. Versuchte verschiedene Techniken (insbesondere mit/ohne warten). Dieser Code befindet sich in einem (async) Schaltflächenereignishandler.Ausnahme nicht in Task.Run

try 
{ 
    // Task.Run(() => GetMoreCodes(CodeBufferMaxSize)); 
    // await Task.Run(() => GetMoreCodes(0)); 
    await Task.Run(() => { throw new Exception("test!"); }); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine("Exception caught: " + ex); 
} 

Das sieht für mich wie die meisten Beispiele, die ich hier gesehen und in Blogs, insbesondere in diesem (http://blog.stephencleary.com/ - großen Dank @ stephen-cleary).

Momentan möchte ich nur, dass die Anwendung nicht abstürzt und einen Fehler protokolliert, falls vorhanden. Fehle ich etwas?

+1

Was passiert, wenn Sie einen Haltepunkt setzen und ihn durchlaufen? –

+0

Der Task verfügt über Eigenschaften, um die Ausnahme zu erhalten, die innerhalb des Objekts aufgetreten ist. Um die Ausnahmebedingung zu überprüfen, können Sie einfach etwas wie 'Task t = Task.Run (() => {neue Exception auslösen ("test!");}); while (! t.IsCompleted) Application.DoEvents(); t.Exception; ' –

+0

Versuchen Sie diesen Link. Ich denke, es könnte sein, was Sie suchen http://stackoverflow.com/questions/14990998/how-to-handle-exceptions-in-tasks-with-debugger – sheavens

Antwort

-1
await Task.Run(() => { 
    try 
    { 
     throw new Exception("test!"); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("Catched"); 
    } 
}); 

Warum nicht gerade in der Task.Run() gefangen?

Wenn Sie es in Console.Application mit Ihrem Code abfangen möchten, können Sie es so machen. T.Wait() blockiert jedoch den UI-Thread und wartet darauf, dass der Task beendet wird.

public static void Main(string[] args) 
    { 
     try 
     { 
      Task t = TestError(); 
      t.Wait(); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Catched"); 
     } 

     Console.ReadLine(); 

    } 

    public static async Task TestError() 
    { 
      // Task.Run(() => GetMoreCodes(CodeBufferMaxSize)); 
      // await Task.Run(() => GetMoreCodes(0)); 
      await Task.Run(() => { throw new Exception("test!"); }); 
    } 
+0

Der erste Vorschlag funktioniert und scheint der richtige Weg zu sein. Wenn Sie erklären könnten, warum Exception in diesem Code behandelt werden sollte und nicht in dem Code, der den Thread erstellt, wäre das cool :) Danke! – supafly

+0

@supafly Es ist nicht, und es wird * funktionieren, damit der wartende Code die Ausnahme findet. – Servy

Verwandte Themen