C# - Try/Catch с выражением предиката

Ниже приведен пример, взятый из MSDN, try-catch (справочник по C#)

catch (ArgumentException e) if (e.ParamName == "…")
{
}

Они также говорят

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

Фильтры исключений предпочтительнее перехвата и повторного создания (поясняется ниже), поскольку фильтры не повреждают стек. Если более поздний обработчик сбросит стек, вы сможете увидеть, откуда исходно возникло исключение, а не только место, где оно было вызвано в последний раз. Распространенным использованием выражений фильтра исключений является ведение журнала. Вы можете создать предикатную функцию, которая всегда возвращает false, которая также выводит в журнал, вы можете регистрировать исключения по мере их прохождения без необходимости их обработки и повторного создания.

Мой код:

static bool LogFunction(System.Exception ex)
{
    System.Console.WriteLine("Writing to logfile: {0}", ex.Message);
    return false;
}

static void Main(string[] args)
{
    try
    {
        throw new System.ArgumentException("The exception message...");
    }
    catch(System.Exception ex) if (LogFunction(ex))
    {
        System.Console.WriteLine("This will not be executed, ever!");
    }
    catch(System.ArgumentException ex)
    {
        // ....
    }
}

Теперь компилятор не будет компилировать это (csc.exe), выдавая следующее сообщение об ошибке:

error CS1003: Syntax error, 'when' expected

Изменить: компилятор вызывает ошибку для строки

error CS1003: Syntax error, 'when' expected

Что я делаю неправильно?

Спасибо.

EDIT: я отправил отзыв в MSDN, указав на ошибку в документации.


person jensa    schedule 19.11.2015    source источник
comment
Логика фильтра перехвата доступна только в составе VS2015. Это версия, которую вы используете?   -  person AWinkle    schedule 19.11.2015
comment
Насколько я помню, это если было заменено ключевым словом «когда», попробуйте поменять местами, если на когда   -  person MajkeloDev    schedule 19.11.2015
comment
Я компилирую через «Командную строку разработчика для VS2015», так что да. У меня есть сообщество Visual Studio 2015.   -  person jensa    schedule 19.11.2015
comment
Не следует ли вместо if заменить слово when?   -  person entropic    schedule 19.11.2015
comment
Ошибки документации для победы!   -  person Frédéric Hamidi    schedule 19.11.2015
comment
Да, это была ошибка в документации.   -  person jensa    schedule 19.11.2015
comment
Хм. ошибка тоже очевидна ;)   -  person M.kazem Akhgary    schedule 19.11.2015
comment
В документации также есть catch с заглавной буквой C. Пожалуйста, отметьте это в MSDN, используя функцию Any Suggestions.   -  person AWinkle    schedule 19.11.2015
comment
Обновление: документация еще не исправлена...   -  person jensa    schedule 03.12.2015


Ответы (1)


Это ошибка на сайте MSDN. Как предлагает компилятор, вы должны использовать when вместо if.

person Jakub Lortz    schedule 19.11.2015
comment
Доступна ли языковая спецификация для версии С#, в которой есть эта функция? - person recursive; 19.11.2015
comment
Спасибо, это сработало! Я думаю, кто-то должен указать на это ребятам из MSDN. - person jensa; 19.11.2015
comment
@recursive Кажется, последняя версия спецификации предназначена для C # 5.0. - person Jakub Lortz; 19.11.2015
comment
@recursive Якуб прав, 5.0 была последней официальной версией, спецификация 6.0, кажется, похоронена на странице проекта Roslyn в виде дорожных карт, функций и билетов. - person Ron Beyer; 19.11.2015