Lepszy sposób wyświetlania komunikatów o błędach w metodach asynchronicznych

Fakt, że nie możemy użyćawait słowo kluczowe wcatch bloki sprawiają, że dość trudno jest wyświetlać komunikaty o błędach z metod asynchronicznych w WinRT, ponieważMessageDialog API jest asynchroniczne. Idealnie chciałbym móc to napisać:

    private async Task DoSomethingAsync()
    {
        try
        {
            // Some code that can throw an exception
            ...
        }
        catch (Exception ex)
        {
            var dialog = new MessageDialog("Something went wrong!");
            await dialog.ShowAsync();
        }
    }

Ale zamiast tego muszę to napisać tak:

    private async Task DoSomethingAsync()
    {
        bool error = false;
        try
        {
            // Some code that can throw an exception
            ...
        }
        catch (Exception ex)
        {
            error = true;
        }

        if (error)
        {
            var dialog = new MessageDialog("Something went wrong!");
            await dialog.ShowAsync();
        }
    }

Wszystkie metody, które muszą to zrobić, muszą być zgodne z podobnym schematem, co naprawdę mi się nie podoba, ponieważ zmniejsza czytelność kodu.

Czy jest lepszy sposób na to poradzić?

EDYTOWAĆ: Wymyśliłem to (co jest podobne do sugestii svicka w jego komentarzach):

static class Async
{
    public static async Task Try(Func<Task> asyncAction)
    {
        await asyncAction();
    }

    public static async Task Catch<TException>(this Task task, Func<TException, Task> handleExceptionAsync, bool rethrow = false)
        where TException : Exception
    {
        TException exception = null;
        try
        {           
            await task;
        }
        catch (TException ex)
        {
            exception = ex;
        }

        if (exception != null)
        {
            await handleExceptionAsync(exception);
            if (rethrow)
                ExceptionDispatchInfo.Capture(exception).Throw();
        }
    }
}

Stosowanie:

private async Task DoSomethingAsync()
{
    await Async.Try(async () => 
    {
        // Some code that can throw an exception
        ...
    })
    .Catch<Exception>(async ex =>
    {
        var dialog = new MessageDialog("Something went wrong!");
        await dialog.ShowAsync();
    });
}

.Catch<...> połączenia można łączyć w łańcuchy wielokrotnecatch Bloki.

Ale nie jestem naprawdę zadowolony z tego rozwiązania; składnia jest jeszcze bardziej niezręczna niż wcześniej ...

questionAnswers(2)

yourAnswerToTheQuestion