Код в обработчике исключенных исключений исключает исключение 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
не удался. Не уверен, что это ошибка или что-то, что вы должны исправить...