Является ли это достаточным доказательством эффективности обработки исключений


У нас есть несколько разработчиков в дом, что считаю, что это лучшая практика, чтобы использовать исключения передачи как поток управления, а также, думая, что ловить и повторной генерации исключений эффективной обработки ошибок.

В стремлении получить образование, я попытался придумать простой пример, чтобы продемонстрировать их негативных последствий этого. Следующий пример кода является то, что я придумал. Он последовательно показывает, что существует штраф за безвозмездное использование конструкции try/catch блоки, но эффекта гораздо больше, чем я ожидал. Я не могу помочь, но думаю, что я сделал что-то очень неправильно в этом образце. Я бы признателен за любые предложения по улучшению.

В этом примере я сравнивая стоимость ловли и повторной генерации исключения с просто исключение пузыриться. Мне нужно, чтобы выполнить методы параллельно, чтобы избежать дней жду код для выполнения на высоких значениях.

    static void Main(string[] args)
    {
        TimeSpan ts1 = new TimeSpan();
        TimeSpan ts2 = new TimeSpan();
        List<Task> tasks = new List<Task>();

        for (int i = 0; i < 100; ++i)
        {
            Task a = new Task(() =>
            {
                Stopwatch watch1 = new Stopwatch();
                watch1.Start();
                function1(function2);
                watch1.Stop();
                ts1 += watch1.Elapsed;
            });
            a.Start();
            tasks.Add(a);

            Task b = new Task(() =>
            {
                Stopwatch watch2 = new Stopwatch();
                watch2.Start();
                function1(function3);
                watch2.Stop();
                ts2 += watch2.Elapsed;
            });
            b.Start();
            tasks.Add(b);
        }

        while (!tasks.All(t => t.IsCompleted)) ;
        Console.WriteLine("Watch1: " + ts1);
        Console.WriteLine("Watch2: " + ts2);
        Console.ReadLine();
    }

    static void function1(Action action)
    {
        try
        {
            action();
        }
        catch
        {
        }
    }

    static void function2()
    {
        try
        {
            int.Parse(null);
        }
        catch
        {
            throw;
        }
    }

    static void function3()
    {
        int.Parse(null);
    }      


303
2
задан 16 августа 2011 в 08:08 Источник Поделиться
Комментарии
1 ответ

В то время как цикл, который вы используете, влияет на производительность. Спать, что проверить немного заранее, чтобы дать вашим сценариям некоторое время, чтобы подумать.

do { Thread.Sleep(3000); } while (!tasks.All(t => t.IsCompleted));

Вы можете предложить некоторые рекомендации по чтению для вашей команды, выдавая исключение, которое должно быть зарезервировано для исключительных обстоятельств. Использование броска для повторной генерации исключения правильно держать стек трассировки в комплекте, но опять же, должно быть редко и когда они действительно наконец-то в топ, за исключением информации должны быть отражены таким образом, что они не просто проигнорировали.

http://www.codeproject.com/KB/architecture/exceptionbestpractices.aspx

https://stackoverflow.com/questions/409563/best-practices-for-exception-management-in-java-or-c

http://www.codethinked.com/how-do-you-deal-with-exceptions

2
ответ дан 16 августа 2011 в 11:08 Источник Поделиться