Код в обработчике исключенных исключений исключает исключение NullReferenceException при доступе к исключению

Когда я компилирую приложение UWP с компилятором .NET Native и включаю оптимизацию кода (в основном режим выпуска), тогда я получаю NullReferenceException, когда пытаюсь получить доступ к фактическому исключению в блоке catch.

Пример кода:

try
{
    throw new ArgumentNullException("Param");
}
catch (ArgumentNullException ex) when (ex.ParamName == "Param")
{
    ErrorBlock.Text = ex.ParamName; // ErrorBlock is a TextBlock in the xaml
}
catch (Exception)
{
}

Он переходит в правильный блок catch и бросает NullReferenceException, когда я обращаюсь к ex. Это происходит только тогда, когда включена поддержка .NET и Native.

Что вызывает эту проблему?

Ответ 1

Я работаю над командой .NET Rational и компилятором.

Это ошибка внутри нашего компилятора. Вы можете думать о каждой области обработки исключений (try, catch, finally, when) в качестве небольшой функции или "funclet". Мы теряем отслеживание объекта исключения при настройке стека для "когда" (так называемый блок фильтра). Эта ошибка исправлена ​​в Windows Tools 1.3, которая, не допуская серьезных неудач, должна быть отправлена ​​через неделю или две. Он будет отображаться как обновление для людей, которые установили обновление VS 2015.

Сообщите мне, если у вас есть другие вопросы.

Ответ 2

Я не совсем уверен, почему это происходит неправильно (отлаживалось довольно долгое время), но отсутствие await вызывало у меня любопытство.

Если вы ожидаете метода ShowAsync, код работает без проблем (очевидно, вам нужно сделать метод async, если вы этого еще не сделали):

await new MessageDialog("Argument null exception: " + argEx.Message).ShowAsync();

Пока блок кода без await не удался. Не уверен, что это ошибка или что-то, что вы должны исправить...