Обработка исключений (библиотека параллельных задач) .Net Framework 4.0 Beta 2 - PullRequest
2 голосов
/ 11 января 2010

в данный момент я пробую некоторые из новых функций параллельной библиотеки задач, поставляется с .Net Framework 4.0 Beta 2.

Мой вопрос относится конкретно к обработке исключений в TPL как описано здесь: http://msdn.microsoft.com/en-us/library/dd997415%28VS.100%29.aspx

Первый пример (немного изменил):

    static void Main(string[] args)
    {
        var task1 = Task.Factory.StartNew(() =>
        {
            throw new Exception("I'm bad, but not too bad!"); // Unhandled Exception here...
        });

        try
        {
            task1.Wait(); // Exception is not handled here....
        }
        catch (AggregateException ae)
        {
            foreach (var e in ae.InnerExceptions)
            {
                Console.WriteLine(e.Message);
            }

        }

        Console.ReadLine();
    }

Согласно документации исключение должно распространяться обратно к присоединяющейся ветке, которая вызывает: task1.Wait().

Но я всегда получаю необработанное исключение в течение:

var task1 = Task.Factory.StartNew(() =>
{
    throw new MyCustomException("I'm bad, but not too bad!");
});

Может ли кто-нибудь объяснить мне, почему, или кто-то знает, если что-то изменилось после выпуска Бета-версии 2?

Ответы [ 2 ]

9 голосов
/ 10 марта 2010

Ответ в статье, которую вы связали:

Когда включен «Просто мой код», Visual Студия в некоторых случаях сломается на линия, которая выбрасывает исключение и отобразить сообщение об ошибке, которое говорит msgstr "исключение не обработано кодом пользователя." Эта ошибка доброкачественная. Вы можете нажать F5 продолжить и увидеть поведение обработки исключений, которое продемонстрировано в этих примерах. к предотвратить взлом Visual Studio первая ошибка, просто снимите флажок Флажок «Просто мой код» в разделе «Инструменты», Опции, Отладка, Общие.

1 голос
/ 11 января 2010

Возможно, ваше исключение выдается до того, как вы достигнете оператора try и соответствующего ожидания.

Попробуйте это:

static void Main(string[] args)
{

    try
    {   
        // Move this inside teh try block, so catch can catch any exceptions thrown before you get to task1.Wait();
        var task1 = Task.Factory.StartNew(() =>
        {
            throw new Exception("I'm bad, but not too bad!"); // Unhandled Exception here...
        });

        task1.Wait(); // Exception is not handled here....
    }
    catch (AggregateException ae)
    {
        foreach (var e in ae.InnerExceptions)
        {
            Console.WriteLine(e.Message);
        }

    }

    Console.ReadLine();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...