Фильтры исключений в C# 6.0
От: Тепляков Сергей Владимирович США http://sergeyteplyakov.blogspot.com/
Дата: 18.11.15 17:09
Оценка: 20 (2)
Статья:
Фильтры исключений в C# 6.0
Автор(ы): Тепляков Сергей Владимирович
Дата: 18.11.2015
Данная статья рассказывает о новой возможности C# 6.0 – фильтрах исключений. Приводятся примеры применения, разбираются опасности и проблемы их применения.


Авторы:
Тепляков Сергей Владимирович

Аннотация:
Данная статья рассказывает о новой возможности C# 6.0 – фильтрах исключений. Приводятся примеры применения, разбираются опасности и проблемы их применения.
Re: Фильтры исключений в C# 6.0
От: Shmj Ниоткуда  
Дата: 19.11.15 00:01
Оценка:
Здравствуйте, Тепляков Сергей Владимирович, Вы писали:

ТСВ>Данный вариант синтаксиса доступен в публичной версии VS2015, но он будет изменен в финальной версии языка C#. Вместо if будет использоваться ключевое слово when.


Дык... А почему в статье if? Вроде уже сейчас when нужно писать.
Re[2]: Фильтры исключений в C# 6.0
От: SergeyT. США http://sergeyteplyakov.blogspot.com/
Дата: 19.11.15 01:17
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Дык... А почему в статье if? Вроде уже сейчас when нужно писать.


Она только сейчас была выложена на сайте, а на написана она была тогда, когда был еще if.
Re: Фильтры исключений в C# 6.0
От: Sinix  
Дата: 19.11.15 07:49
Оценка: 5 (1)
Здравствуйте, Тепляков Сергей Владимирович, Вы писали:

ТСВ>Аннотация:

ТСВ>Данная статья рассказывает о новой возможности C# 6.0 – фильтрах исключений. Приводятся примеры применения, разбираются опасности и проблемы их применения.

Самые важные на практике нюансы не раскрыты, неплохо бы добавить в статью
1.

X DO NOT throw exceptions from exception filter blocks.
When an exception filter raises an exception, the exception is caught by the CLR, and the filter returns false. This behavior is indistinguishable from the filter executing and returning false explicitly and is therefore very difficult to debug.

(пруф)

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

2. Фильтр выполняется _перед_ _всеми_ finally выше по стеку, пруф #2. Оно как бы очевидно, но не менее больно выстреливает. Для сомневающихся: попробуйте угадать вывод в
        static bool Filter(string message, bool filter)
        {
            Console.WriteLine(message);
            return filter;
        }

        static void A()
        {
            try
            {
                B();
            }
            catch when (Filter("A filter", true))
            {
                Console.WriteLine("A catch");
            }
            finally
            {
                Console.WriteLine("A finally");
            }
        }
        static void B()
        {
            try
            {
                C();
            }
            catch when (Filter("B filter", false))
            {
                Console.WriteLine("B catch");
                throw;
            }
            finally
            {
                Console.WriteLine("B finally");
            }
        }
        static void C()
        {
            try
            {
                throw null;
            }
            catch when (Filter("C filter", true))
            {
                Console.WriteLine("C catch");
                throw;
            }
            finally
            {
                Console.WriteLine("C finally");
            }
        }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.