Может быть много причин, по которым вы получаете исключение, а он нет, что, скорее всего, связано с расположением символа NULL. Согласно его стеку, его нулевой символ, кажется, находится в конце XML, в позиции 115227. Возможно, текст перед ним является просто допустимым XML и что дополнительный символ NULL был добавлен в конец файла случайно , Где у вас ваш NULL персонаж?
Или его символ NULL находится внутри атрибута или элемента и считается частью текста. Это также может зависеть от того, является ли XML UTF-8, UTF-16 или другим типом кодировки. Слишком много переменных для рассмотрения.
Когда символ NULL находится в конце, весь файл просто оказывается хорошей строкой с нулевым символом в конце. Тем не менее, как вы говорите, странно, что оно считается необработанным исключением, когда оно находится внутри блока try-Кроме ...
Здесь есть интересное прочтение о перехвате необработанных исключений, но это не объясняет, почему они случаются.
Но если мне нужно угадать ... За классом XML есть куча неуправляемого кода. Из-за символа NULL этот неуправляемый код запутывается и создает ошибку при его освобождении. Вызов SelectNodes () вызовет проверку и обнаружит ошибку, поэтому она возникает. Система начинает обрабатывать обработчик исключений, но сначала пытается освободить xDoc, поскольку он не используется внутри или после блока исключений. Это освобождает неуправляемый код, но неуправляемый код все еще запутан, поэтому он снова вызывает исключение. Это помешает Catch обработать исключение.
Вы можете проверить это, добавив второй xDoc.Load () после оператора Catch, что предотвратит освобождение xDoc до Catch.
Тем не менее, это всего лишь предположение ... Мне кажется, ошибка .NET.