XmlSerializer: исключение внутри средства установки свойств перехвачено в .NET 2.0, но не в 4.0

#.net #exception #xml-serialization

#.net #исключение #xml-сериализация

Вопрос:

Я не могу найти ответ на это. Надеюсь, кто-нибудь может помочь.

У меня есть средство установки свойств, которое выдает исключение, если значение не соответствует определенным условиям. Класс, в котором находится свойство, сериализуется / десериализуется.

При десериализации класса в .NET 2.0 перехватывается исключение. Если я изменю цель проекта на .NET 4.0, исключение не будет перехвачено!

Есть идеи?

Спасибо, Сэм


Извините. Под «исключением» я имею в виду то, которое я создаю. Вот пример кода.

Это пример класса, который я хочу сериализовать / десериализовать:

 public class MyClass
{
    public string Name
    {
        get{return myName;}
        set
        {
            if (value == "") throw new Exception("Name is blank!");
            myName = value;
        }
    }

    private string myName;
}
  

И вот код, который вызывает десериализатор.

         try
        {
            XmlSerializer xs = new XmlSerializer(typeof(MyClass));
            using (FileStream stream = File.OpenRead("myclass.xml"))
            {
                MyClass mc = xs.Deserialize(stream) as MyClass;
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
  

Вот «myclass.xml » файл для проверки исключения.

 <?xml version="1.0"?>
<MyClass>
  <Name></Name>
</MyClass>
  

Используя .NET 2.0, я получаю окно сообщения с сообщением об исключении. Используя .NET 4.0, я получаю «Исключение, не обработанное пользовательским кодом».

Спасибо,

Сэм

Комментарии:

1. Что вы подразумеваете под «перехваченным исключением»? Можете ли вы предоставить какой-нибудь код и объяснение того, какое исключение генерируется / не генерируется или перехвачено / не перехвачено?

2. Не могли бы вы опубликовать сокращенный пример кода, позволяющий воспроизвести / проиллюстрировать проблему?

3. Подтверждено — я тестировал с 3.5 (исключение, правильно показанное пользователю) и 4.0 (исключение, не обработанное пользовательским кодом).

4. Если вы запустите программу вне IDE, вы обнаружите, что исключение обрабатывается во всех случаях. Аналогично, если вы отключите «Прерывание для необработанных пользователем исключений CLR», исключение будет обработано. Однако я не понимаю, почему происходит это изменение в поведении.

5. Интересно! Я не тестировал вне IDE.

Ответ №1:

Временный обходной путь заключается в отключении прерывания для необработанных пользователем исключений.

  • Отладка
    • Исключения…
      • Снимите флажок «Необработанный пользователем» для «Исключений среды выполнения Common Language».

Отключить обработку исключений

Вы можете отключить это для конкретного исключения, которое вы создаете, если вам нужна детализация.

Обратите внимание, что это следует рассматривать только как временное решение. Обычно вы захотите отметить это галочкой, поскольку это действительно полезное средство отладки!