Try-Catch Async Exceptions

Этот пример "терпит неудачу":

static async void Main(string[] args)
{
    try
    {
        await TaskEx.Run(() => { throw new Exception("failure"); });
    }
    catch (Exception)
    {
        throw new Exception("success");
    }
}

То есть всплывает исключение с текстом "отказ".

Затем я попробовал этот обходной путь:

static async void Main(string[] args)
{
    try
    {
        await SafeRun(() => { throw new Exception("failure"); });
    }
    catch (Exception)
    {
        throw new Exception("success");
    }
}

static async Task SafeRun(Action action)
{
    var ex = default(Exception);
    await TaskEx.Run(() =>
    {
        try
        {
            action();
        }
        catch (Exception _)
        {
            ex = _;
        }
    });
    if (ex != default(Exception))
        throw ex;
}

Это тоже не помогло.

Я полагаю, что моя установка обновления Async CTP могла быть закрыта.

Должен ли этот код работать так, как я ожидал («успех» всплывает, а не «сбой»), или это не «предполагается» работать таким образом. А если нет, как бы вы обошли его?

9
задан svick 12 February 2013 в 01:08
поделиться