Этот код отлично работает уже много лет.
Решение написано на VB.NET и состоит из десятков проектов. Когда мы работаем с объектом Word.Document, он обычно называется oWDoc, поэтому мы можем использовать код типа
Код: Выделить всё
oWDoc = oWApp.Documents.Open(sFileName)
После выполнения наших «материалов» нам часто нужно просто закрыть этот документ, не сохраняя изменений. Как это типично для устаревших приложений, эта функциональность не полностью единообразна во всем решении. Мы можем увидеть следующие варианты этой темы:
Код: Выделить всё
oWDoc.Close(False)
oWDoc.Close(0)
oWDoc.Close(Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges)
oWDoc.Close(SaveChanges:=Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges)
System.Runtime.InteroptServices.COMException: «Команда не выполнена»
Что мне совершенно ни о чем не говорит. Я просматриваю код и обнаруживаю ошибку, и все, что я получаю, — это эта ошибка. Что ж, в объекте Exception есть «справочная ссылка» с текстом «wdmain11.chm#36966», но когда я ищу ее, в том числе в StackOverflow, я не получаю ничего, что помогло бы мне выяснить, в чем проблема. Для объекта Exception нет InnerException. Свойство Data объекта Exception не содержит никаких значений. Источник содержит «Microsoft Word».
Но все становится еще страннее.
Когда я смотрю на объект Word.Application oWApp, я вижу количество документов. Я сохраняю это в локальную переменную:
Код: Выделить всё
nOpenDocs = oWApp.Documents.Count
Код: Выделить всё
nOpenDocs = oWApp.Documents.Count
Итак, несмотря на то, что это вызвало ошибку, .Close действительно удался.
Но что теперь? Я, конечно, могу просмотреть весь наш код и обернуть каждый вызов метода .Close в try/catch. И я мог бы даже добавить подсчет документов, просто чтобы быть уверенным, что после .Close действительно есть на один открытый документ меньше.
Но в конечном итоге что-то выдает ошибку, и я хотел бы устранить эту неполадку, чтобы я мог быть уверен, что я не просто замалчиваю реальную проблему. Но здесь я застрял. Как мне это отладить? Перехват исключения ничего не говорит мне, как описано выше. Я тоже ничего не вижу в средстве просмотра событий Windows. Или я могу искать не в том месте?
Даже если я сведу проблему к минимуму, ошибка COM все равно возникает. В этом примере я буквально просто добавляю новый Word.Document только для того, чтобы закрыть его, не сохраняя изменений в том же операторе:
Код: Выделить всё
oWApp.Documents.Add().Close(Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges)
Подробнее здесь: https://stackoverflow.com/questions/798 ... mexception
Мобильная версия