Как поймать InvalidOperationException, созданное методом Deserialize

Я использую следующий код для чтения данных из XML

var temp = default(T);
var serializer = new XmlSerializer(typeof(T));

try
{
    TextReader textReader = new StreamReader(fileName);
    temp = (T)serializer.Deserialize(textReader);
}
catch (InvalidOperationException ioe)
{
    throw;          
}

Я знаю, что rethorow это избыточная часть, но я хотел сделать это контролируемым образом. Я хочу использовать это место, чтобы показать пользователю, что какой-то файл XML был поврежден (т.е. тег не был закрыт). Все работает нормально, пока я не выйду из класса и не хочу поймать это исключение из класса, который запрашивает эти данные. Кажется, что исключение пропущено и каким-то образом обойдено, и приложение внезапно переходит к другому методу. Почему я не могу поймать это исключение? Я даже создаю свое исключение, но результат был тот же - кажется, что оно просто не покидает исходный класс и вызывает какой-то скачок приложения.


person h__    schedule 18.06.2013    source источник
comment
Потоки? Попробуйте обернуть исключение, чтобы добавить информацию о потоке (ID).   -  person Adriano Repetti    schedule 18.06.2013
comment
Откуда вызывается этот метод? Что это за приложение (веб/десктоп)?   -  person greg84    schedule 18.06.2013


Ответы (3)


исключения десериализации xml работают так же, как и любые другие исключения - никаких сюрпризов (за исключением того, что еще важнее, чем обычно, проверять .InnerExceptions (рекурсивно), потому что вся интересная информация вложена несколькими исключениями вниз).

Может быть, вы просто ловите неправильный тип исключения? Например, нет гарантии, что это InvalidOperationException. Пока вызывающий метод имеет try с catch(Exception ex), он должен перехватывать любые исключения, возникающие во время десериализации.

person Marc Gravell    schedule 18.06.2013

Я нашел причину. Метод, выбрасывающий это исключение, был вызван конструктором статического класса. И именно поэтому исключение не было выброшено. Статические конструкторы вызываются в начале, и они просто не генерируют исключения (не так ли?). Я изменил исходный код, извлекая метод из xonstructor и вызывая его вручную - теперь я могу поймать исключение в верхнем слое.

person h__    schedule 18.06.2013

вы можете использовать XSD для проверки этого, есть единственный известный мне способ динамической проверки такого рода, это Ссылка может помочь

person renefc3    schedule 18.06.2013