Подтвердить что ты не робот

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

Ниже приведен пример из MSDN, try-catch (ссылка на С#)

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, указав ошибку в документации.

4b9b3361

Ответ 1

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