Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Исключения бросаются при дебаге, даже если перехватываются? / 10 сообщений из 10, страница 1 из 1
09.04.2015, 19:04
    #38932387
НемоКэп42
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключения бросаются при дебаге, даже если перехватываются?
На строчке, помеченной комментарием, бросается исключение. При дебаге. При запуске даже debug варианта из файлового каталога - не бросается. Это нормальное поведение?


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate))
{
    XmlSerializer serializer = new XmlSerializer(typeof(ViewModel[]));

    try
    {
/**/    viewModels = (ViewModel[])serializer.Deserialize(fs);
        ViewModels = new ObservableCollection<ViewModel>(viewModels);
    }

    catch(Exception ex) 
    {
        Creatures = new ObservableCollection<ViewModel>();
    }
}
...
Рейтинг: 0 / 0
09.04.2015, 19:13
    #38932404
НемоКэп42
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключения бросаются при дебаге, даже если перехватываются?
Не, ну это ваще уже! Как вам такой вариант - бросается исключение на помеченной строчке. При этом жму ф5 - и какой-то бесконечный цикл и постоянно на этой строчке бросается исключение. В дебаге. Из каталога если запустить, то сразу "закрыть программу".


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public ListViewModel()
{
    ViewModel[] viewModels;

    using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate))
    {
        XmlSerializer serializer = new XmlSerializer(typeof(ViewModel[]));

        if (serializer.CanDeserialize(XmlReader.Create(fs)))
        {
/**/        viewModels = (ViewModel[])serializer.Deserialize(fs);
            ViewModels = new ObservableCollection<ViewModel>(viewModels);
        }

        else
        {
            ViewModels = new ObservableCollection<ViewModel>();
        }
    }
}
...
Рейтинг: 0 / 0
09.04.2015, 19:20
    #38932414
НемоКэп42
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключения бросаются при дебаге, даже если перехватываются?
НемоКэп42Не, ну это ваще уже! Как вам такой вариант - бросается исключение на помеченной строчке. При этом жму ф5 - и какой-то бесконечный цикл и постоянно на этой строчке бросается исключение. В дебаге. Из каталога если запустить, то сразу "закрыть программу".
Это если там нормальный xml и правильный тип в нём засериализован. А если вообще файла нет или он пустой - постоянная ошибка в цикле "отсутствует корневой элемент).

А если нормальный xml и неправильный тип - то CanDeserialize выдаёт false - это мне и надо.



Я что-то ваще ничего не понял - CanDeserialize это не универсальная проверка? Т. е. он отработает на true или false только если там правильно сформированный xml? А на пустой файл или его отсутствие он кидает исключения сам? ЭТО ЖЕ САМЫЙ ПЛОХОЙ КОД! Такие методы не должны кидать исключений - они должны возвращать тру или фолс. Это Deserialize может кидать. Кто там этот фреймворк разрабатывает, мать его?!
...
Рейтинг: 0 / 0
09.04.2015, 19:36
    #38932423
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключения бросаются при дебаге, даже если перехватываются?
НемоКэп42,

дык у тебя XmlReader.Create(fs) кидает exception, или CanDeserialize?
...
Рейтинг: 0 / 0
09.04.2015, 19:48
    #38932428
НемоКэп42
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключения бросаются при дебаге, даже если перехватываются?
Короче, я запутался. Там эта хрень то кидает, то не кидает. То кидает, но только пару раз, а потом работает (в дебаге жмёшь два раза ф5).

Брал пример отсюда
https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.candeserialize(v=vs.110).aspx

И этот пример не работает, если не поставить поток в нулевую позицию после CanDeserialize и до Serialize. Например, так

fs.Position = 0;

Ну и ещё кучу проверок надо по-правильному делать:

- есть ли файл;
- пустой ли он;
- правильная ли там схема документа (CanDeserialize кидает исключение, если там абракадабра или пустой файл) - хрен знает, как это валидно проверять;
- потом только проверять через CanDeserialize;
- и потом только использовать Deserialize.

Пипец!
...
Рейтинг: 0 / 0
09.04.2015, 20:58
    #38932458
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключения бросаются при дебаге, даже если перехватываются?
НемоКэп42Пипец!
займись сельским хозяйством
...
Рейтинг: 0 / 0
09.04.2015, 21:59
    #38932489
НемоКэп42
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключения бросаются при дебаге, даже если перехватываются?
Какая правильная последовательность действий при попытке десереализовать xml-файл? При этом условия:

1) файл может отсутствовать;
2) файл может быть, но пустой;
3) файл может быть, но не с расширением xml;
4) файл может быть с расширением xml, но не содержать валидный xml (может содержать всякую абракадабру или испорченный xml);
5) файл может быть с расширением xml, содержать валидный xml, но не тот сериализованный объект, что мне нужен;
6) файл существует и именно тот, что мне нужен.

Я делаю так:

1) File.Exists()
2) - 4) XmlSerializer.CanDeserialize()
5) XmlSerializer.Deserialize()
6) XmlSerializer.Deserialize()

Проблема в том, что на любом из этапов 2-4 метод XmlSerializer.CanDeserialize() не работает - бросает исключения. Ну и зачем этот метод нужен? Кстати, в МСДН не сказано, что этот метод может бросать исключения. А кроме того, он изменяет позицию потока, в котором XML, который он проверяет на десериализацию. Т. е. последующий за ним Deserialize должен начать с нулевой позиции, чтобы не выкинуть исключение. А этого тоже в МСДН нет. Зато там есть неправильный пример, который не содержит возвращение позиции в потоке на начало потока.
...
Рейтинг: 0 / 0
10.04.2015, 03:22
    #38932574
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключения бросаются при дебаге, даже если перехватываются?
НемоКэп42На строчке, помеченной комментарием, бросается исключение. При дебаге. При запуске даже debug варианта из файлового каталога - не бросается. Это нормальное поведение?


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate))
{
    XmlSerializer serializer = new XmlSerializer(typeof(ViewModel[]));

    try
    {
/**/    viewModels = (ViewModel[])serializer.Deserialize(fs);
        ViewModels = new ObservableCollection<ViewModel>(viewModels);
    }

    catch(Exception ex) 
    {
        Creatures = new ObservableCollection<ViewModel>();
    }
}


Потому что при запуске из каталога нет IDE, контрорлирующего исполнение кода - исключение попадает в catch-блок, и поскольку повторных пробросов в catch нет, программа идет себе дальше. В IDE при исключении сама же IDE и делает остановку в точке исключения. Эту остановку можно отключить: главное меню - Debug - Exceptions, найти тип исключения в ноде Common Language Runtime Exception, снять все галки.
НемоКэп42Я что-то ваще ничего не понял - CanDeserialize это не универсальная проверка? Т. е. он отработает на true или false только если там правильно сформированный xml? А на пустой файл или его отсутствие он кидает исключения сам?
На пустой файл исключение кидает XmlReader.Create. На отсутствующий файл исключение кидает конструктор FileStream. В обеих ситуациях до CanDeserialize дело еще не дошло. Ваш К.О.
НемоКэп42ЭТО ЖЕ САМЫЙ ПЛОХОЙ КОД! Такие методы не должны кидать исключений - они должны возвращать тру или фолс. Это Deserialize может кидать. Кто там этот фреймворк разрабатывает, мать его?!
Тот, кто хорошо понимает, где выбрасываются исключения.
...
Рейтинг: 0 / 0
10.04.2015, 06:08
    #38932596
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключения бросаются при дебаге, даже если перехватываются?
НемоКэп42А кроме того, он изменяет позицию потока, в котором XML, который он проверяет на десериализацию. Т. е. последующий за ним Deserialize должен начать с нулевой позиции, чтобы не выкинуть исключение. А этого тоже в МСДН нет. Зато там есть неправильный пример, который не содержит возвращение позиции в потоке на начало потока.
Если используется экземпляр XmlReader для проверки CanDeserialize, то и десериализацию нужно делать через XmlReader:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
const string file = @"D:\Trash\1234.56789";
var serializer = new XmlSerializer(typeof (List<int>));
using(var fs = new FileStream(file, FileMode.Create))
using(var xw = XmlWriter.Create(fs, new XmlWriterSettings{Indent = true}))
  serializer.Serialize(xw, Enumerable.Range(1, 3).ToList());
Console.WriteLine(File.ReadAllText(file));
using (var fs = new FileStream(file, FileMode.Open))
{
  using (var xmlReader = XmlReader.Create(fs))
    if (serializer.CanDeserialize(xmlReader))
      ((List<int>)serializer.Deserialize(xmlReader)).ForEach(Console.WriteLine);
    else
      throw new ApplicationException("Cannot deserialize stream data");
}


Вывод:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfInt xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd=" http://www.w3.org/2001/XMLSchema"> 
  <int>1</int>
  <int>2</int>
  <int>3</int>
</ArrayOfInt>
1
2
3
...
Рейтинг: 0 / 0
10.04.2015, 06:11
    #38932598
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключения бросаются при дебаге, даже если перехватываются?
Ну, и да, пример в MSDN как бы тоже использует Deserialize(XmlReader) после проверки CanSerialize(XmlReader). И пример вполне правильный.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Исключения бросаются при дебаге, даже если перехватываются? / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]