0
0
C Sharp (C#)programming~20 mins

Exception handling in async code in C Sharp (C#) - Practice Problems & Coding Challenges

Choose your learning style9 modes available
Challenge - 5 Problems
🎖️
Async Exception Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
Predict Output
intermediate
2:00remaining
Output of async method with try-catch
What is the output of this C# program when run?
C Sharp (C#)
using System;
using System.Threading.Tasks;

class Program {
    static async Task Main() {
        try {
            await ThrowExceptionAsync();
        } catch (Exception ex) {
            Console.WriteLine($"Caught: {ex.Message}");
        }
    }

    static async Task ThrowExceptionAsync() {
        await Task.Delay(10);
        throw new InvalidOperationException("Error happened");
    }
}
ACaught: Error happened
BCaught: System.InvalidOperationException
CNo output
DUnhandled exception: Error happened
Attempts:
2 left
💡 Hint
Remember that exceptions thrown inside awaited async methods can be caught by try-catch around the await.
Predict Output
intermediate
2:00remaining
Exception behavior without await
What happens when this C# program runs?
C Sharp (C#)
using System;
using System.Threading.Tasks;

class Program {
    static async Task Main() {
        try {
            ThrowExceptionAsync();
        } catch (Exception ex) {
            Console.WriteLine($"Caught: {ex.Message}");
        }
        await Task.Delay(50);
        Console.WriteLine("End of Main");
    }

    static async Task ThrowExceptionAsync() {
        await Task.Delay(10);
        throw new InvalidOperationException("Error happened");
    }
}
AEnd of Main
B
Caught: Error happened
End of Main
C
End of Main
Unhandled exception: Error happened
DCaught: System.InvalidOperationException
Attempts:
2 left
💡 Hint
Think about what happens if you don't await an async method that throws an exception.
🔧 Debug
advanced
2:00remaining
Identify the cause of unhandled exception
Why does this program crash with an unhandled exception despite the try-catch block?
C Sharp (C#)
using System;
using System.Threading.Tasks;

class Program {
    static async Task Main() {
        try {
            var task = ThrowExceptionAsync();
        } catch (Exception ex) {
            Console.WriteLine($"Caught: {ex.Message}");
        }
        await Task.Delay(50);
    }

    static async Task ThrowExceptionAsync() {
        await Task.Delay(10);
        throw new InvalidOperationException("Error happened");
    }
}
AThe Task.Delay prevents the exception from being thrown.
BThe try-catch block syntax is incorrect and does not catch exceptions.
CThe exception is swallowed silently and does not crash the program.
DThe exception is thrown after the try-catch block because the task is not awaited inside the try.
Attempts:
2 left
💡 Hint
Consider when exceptions in async methods are observed and caught.
📝 Syntax
advanced
2:00remaining
Which code snippet correctly catches exceptions from multiple awaited tasks?
Select the code snippet that correctly catches exceptions from two async methods awaited in parallel.
A
var t1 = Task1Async();
var t2 = Task2Async();
try {
    await t1;
    await t2;
} catch (Exception ex) {
    Console.WriteLine($"Caught: {ex.Message}");
}
B
try {
    var t1 = Task1Async();
    var t2 = Task2Async();
    await Task.WhenAll(t1, t2);
} catch (Exception ex) {
    Console.WriteLine($"Caught: {ex.Message}");
}
C
try {
    await Task1Async();
    await Task2Async();
} catch (Exception ex) {
    Console.WriteLine($"Caught: {ex.Message}");
}
D
try {
    Task.WaitAll(Task1Async(), Task2Async());
} catch (Exception ex) {
    Console.WriteLine($"Caught: {ex.Message}");
}
Attempts:
2 left
💡 Hint
Think about how to await multiple tasks and catch exceptions from all of them.
🚀 Application
expert
3:00remaining
Determine the final value after exception handling in async code
What is the value of variable 'result' after this code runs?
C Sharp (C#)
using System;
using System.Threading.Tasks;

class Program {
    static int result = 0;

    static async Task Main() {
        try {
            await MethodA();
        } catch {
            result += 10;
        }
        result += 1;
        Console.WriteLine(result);
    }

    static async Task MethodA() {
        try {
            await MethodB();
        } catch {
            result += 5;
            throw;
        }
    }

    static async Task MethodB() {
        await Task.Delay(10);
        throw new Exception("Fail");
    }
}
A16
B6
C11
D1
Attempts:
2 left
💡 Hint
Trace the increments to 'result' through nested try-catch and rethrow.