C# Ausnahmen in Async

Wenn man alle vorhergehenden Posts ignoriert, dann ist das eine akzeptable Lösung.
Am besten nochmal meinen Post 14 durchlesen.
 
  • Gefällt mir
Reaktionen: Ghost_Rider_R
Sieht mir auch nicht save aus. Wenn sehr früh eine Exceptionnfliegt schon bevor das Try einsetzt, wird die auch nicht gegangen...

Evtl unwahrscheinlich, aber möglich.

Warum nicht mit await wie schon vorgeschlagen, so ist es doch vorgesehen. Alles andere sollte man nur in begründeten Ausnahmen und in Wissen der potenziellen Probleme machen.
 
...das passiert nicht. Die Ausnahme wird erst beim Abholen des Ergebnisses gefangen:

C#:
class Program
{
    public static void Main()
    {
        Console.CursorVisible = false;
        Console.WriteLine("Go");
        var task = Task.Run(() => throw new Exception("This exception is expected!"));
        Thread.Sleep(2000);
        try
        {
            task.Wait();
        }
        catch (Exception fehler)
        {
            if (fehler.InnerException != null)
                Console.WriteLine(fehler.InnerException.Message);
        }       
        Console.WriteLine("Ende");
        Console.ReadLine();
    }
}
 
Und was spricht gegen folgendes?
C#:
public static async Task Main()
 
Ok, aber ehrlich gesagt seh ich gar keinen relevanten Unterschied zu Deinem ersten Code, oder ich hab Tomaten auf den Augen. Nur das Du das task.Wait nicht mehr in einer Methode aufrust, sondern direkt in Main, das macht aber keinen Unterschied. Hab Deinen Code aus dem ersten Post mal ins Visual Studio eingefügt, er funktioniert wie erwartet, die Exception wird gefangen und auf der Console ausgegeben. Und auch der Debugger hält dort an. Weiß aber nicht mehr, was ich da evtl. mal eingestellt habe, wo er halten soll und wo nicht.
Und ich würde durchaus alle Ausnahmen fangen wollen und nicht die AggregateException, auch wenn wohl an der Stelle nicht viel anderes passiert.

ex.jpg


Aber alle Nachfragen und Hinweise auf await ignorierst Du ja...
 
Generell sind "async void" Methoden eine Variante die sehr gerne Exceptions verschluckt. Bin mir hier nicht sicher weil Main immer etwas speziell ist, aber ich würde versuchen die Main Methode als async Task zu definieren und die "WerfenAusnahme" Methode zu awaiten wenn du sie dort aufrufst.

Task.Wait() ist hier nicht unbedingt Problem, aber das ist auch so eine Sache die man fast nie machen soll (siehe https://blog.stephencleary.com/2014/10/a-tour-of-task-part-5-wait.html). In der Main Methode ist eine Außnahme, hier kann man es durchaus machen. Aber praktisch überall anders sollte man unbeding async/await verwenden.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Ghost_Rider_R
Hier hatte bisher noch niemand async void vorgeschlagen. Nur bei Event Handlern und nur dort kommt async void zum Einsatz:
C#:
private async void button1_Click(object sender, EventArgs e)
{
  await Button1ClickAsync();
}
 
Zurück
Oben