Debugger not breaking/stopping for exceptions in async method

C#DebuggingExceptionAsync AwaitVisual Studio-Debugging

C# Problem Overview


When a debugger is attached to a .NET process, it (usually) stops when an unhandled exception is thrown.

However, this doesn't seem to work when you're in an async method.

The scenarios I've tried before are listed in the following code:

class Program
{
    static void Main()
    {
        // Debugger stopps correctly
        Task.Run(() => SyncOp());

        // Debugger doesn't stop
        Task.Run(async () => SyncOp());

        // Debugger doesn't stop
        Task.Run((Func<Task>)AsyncTaskOp);

        // Debugger stops on "Wait()" with "AggregateException"
        Task.Run(() => AsyncTaskOp().Wait());

        // Throws "Exceptions was unhandled by user code" on "await"
        Task.Run(() => AsyncVoidOp());

        Thread.Sleep(2000);
    }

    static void SyncOp()
    {
        throw new Exception("Exception in sync method");
    }

    async static void AsyncVoidOp()
    {
        await AsyncTaskOp();
    }

    async static Task AsyncTaskOp()
    {
        await Task.Delay(300);
        throw new Exception("Exception in async method");
    }
}

Am I missing something? How can I make the debugger to break/stop on the exception in AsyncTaskOp()?

C# Solutions


Solution 1 - C#

Under the Debug menu, select Exceptions.... In the Exceptions dialog, next to the Common Language Runtime Exceptions line check the Thrown box.

Solution 2 - C#

I would like to hear if anyone found out how to get around this issue? Perhaps a setting in latest visual studio...?

A nasty but workable solution (in my case) was to throw my own custom Exception and then modify Stephen Cleary's answer:

> Under the Debug menu, select Exceptions (You can use this Keyboard shortcut Control + Alt + E)... In the Exceptions dialog, next to the Common Language Runtime Exceptions line check the Thrown > box. >

to be more specific i.e., add your custom Exception into the list, and then tick its "Thrown" box.

E.g:

async static Task AsyncTaskOp()
{
    await Task.Delay(300);
    throw new MyCustomException("Exception in async method");
}

Solution 3 - C#

I have wrapped the anonymous delegate in a try/catch inside the Task.Run(() =>.

Task.Run(() => 
{
     try
     {
          SyncOp());
     }
     catch (Exception ex)
     {
          throw;  // <--- Put your debugger break point here. 
                  // You can also add the exception to a common collection of exceptions found inside the threads so you can weed through them for logging
     }

});

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSebastian KrysmanskiView Question on Stackoverflow
Solution 1 - C#Stephen ClearyView Answer on Stackoverflow
Solution 2 - C#JimbobView Answer on Stackoverflow
Solution 3 - C#CraigView Answer on Stackoverflow