Как поймать ошибку?

Автор Тема: Как поймать ошибку?  (Прочитано 8454 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн LucaАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 0
Как поймать ошибку?
« : 03-02-2020, 12:29:20 »
Здравствуйте.
"Падает" приложение, притом Violation Access, те я даже StackTrace посмотреть не могу...
Как в такой ситуации найти ошибку...
Пробовал отлаживать (точки останова), вроде норм всё, до конца доходит приложение и на выходе падает.
Не соображу в чём дело.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Как поймать ошибку?
« Ответ #1 : 03-02-2020, 12:37:55 »
Общие рекомендации:
Смотрите окно "Output" ("Вывод") в Visual Studio при отладке. Есть шанс, что там будет полезная информация.
В настройках отладки добавить тип исключения "AccessViolationException" в список исключений, при которых останавливается отладка. Или ставить точку останова в начале команды и выполнять пошагово до тех пор, пока не упадёт. Это, как минимум, поможет понять в каком месте возникает исключение.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как поймать ошибку?
« Ответ #2 : 03-02-2020, 12:58:44 »
Luca,
На этом форуме не гадают на кофейной гуще - нужен исходный код.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Re: Как поймать ошибку?
« Ответ #3 : 03-02-2020, 13:12:51 »
обычно это обращение к null-объекту

Отмечено как Решение Luca 03-02-2020, 13:31:23

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как поймать ошибку?
« Ответ #4 : 03-02-2020, 13:15:25 »
обычно это обращение к null-объекту
Или к объекту, который открыт в транзакции, за пределами этой транзакции... Тут вариантов множество...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LucaАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 0
Re: Как поймать ошибку?
« Ответ #5 : 03-02-2020, 13:17:49 »
Автокад падает при команде  AUTO_ELECTRO_NUMBER_BLOCKS_
Решение разделено на части:
Общие вещи собраны в пространстве Common

Оффлайн LucaАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 0
Re: Как поймать ошибку?
« Ответ #6 : 03-02-2020, 13:18:57 »
обычно это обращение к null-объекту
из документации следует, что это грубая ошибка, сродни NullException, но только обращение за границы, а не к Null

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Re: Как поймать ошибку?
« Ответ #7 : 03-02-2020, 13:22:52 »
нельзя так делать
Код - C# [Выбрать]
  1.             public static List<BlockReference> getListOfBlocks(SelectionSet selectionSet, string layerName)
  2.             {
  3.                 List<BlockReference> listOfBlocks = new List<BlockReference>();
  4.                 Transaction transaction = startTransaction();
  5.                 using (transaction)
  6.                 {
  7.                     foreach (SelectedObject selectionSetObject in selectionSet)
  8.                     {
  9.                         if (selectionSetObject != null)
  10.                         {
  11.                             Entity entity = transaction.GetObject(selectionSetObject.ObjectId, OpenMode.ForRead) as Entity;
  12.                             if (entity is BlockReference block)
  13.                             {
  14.                                 if (block.Layer == layerName)
  15.                                 {
  16.                                     listOfBlocks.Add(block);
  17.                                 }
  18.                             }
  19.                         }
  20.                     }
  21.                     transaction.Commit();
  22.                 }
  23.                 if (listOfBlocks.Count != 0)
  24.                 {
  25.                     return listOfBlocks;
  26.                 }
  27.                 else
  28.                 {
  29.                     Application.ShowAlertDialog("[listOfBlocks:] НЕТ БЛОКОВ. КОЛИЧЕСТВО БЛОКОВ = " + listOfBlocks.Count);
  30.                     return null;
  31.                 }
  32.             }

Посмотри как у меня реализовано - функции CrTbl и GetSelect https://github.com/triroakenshield/tblPrs/blob/master/TableParser/MyTable.vb

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как поймать ошибку?
« Ответ #8 : 03-02-2020, 13:28:31 »
нельзя так делать
Именно то, о чем я и писал выше.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LucaАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 0
Re: Как поймать ошибку?
« Ответ #9 : 03-02-2020, 13:30:20 »
обычно это обращение к null-объекту
Или к объекту, который открыт в транзакции, за пределами этой транзакции... Тут вариантов множество...
Так и есть!
У меня было ощущения, судя по отладке. что с транзакцией что-то не то, но понять что именно я не мог.
Как только Вы сказали, то я сразу нашел transaction.Commit, который не в тех операторных скобках.
Ох, спасибо...

Оффлайн LucaАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 0
Re: Как поймать ошибку?
« Ответ #10 : 03-02-2020, 13:30:45 »
нельзя так делать
Именно то, о чем я и писал выше.
да, я уже понял ... нашел. Спасибо.

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Re: Как поймать ошибку?
« Ответ #11 : 03-02-2020, 13:32:10 »
Цитировать
то я сразу нашел transaction.Commit, который не в тех операторных скобках.
он то как раз там где надо

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как поймать ошибку?
« Ответ #12 : 03-02-2020, 13:35:03 »
Как только Вы сказали, то я сразу нашел transaction.Commit, который не в тех операторных скобках.
У тебя в Common.cs  полный бред, который даже сложно комментировать.
Например,
Код - C# [Выбрать]
  1.             public static BlockTableRecord getBlockByNameFromDocument(string blockName)
  2.             {
  3.                 Transaction transaction = startTransaction();
  4.  
  5.                 BlockTable blockTable = (BlockTable)transaction.GetObject(database.BlockTableId, OpenMode.ForRead);
  6.                 foreach (ObjectId btrID in blockTable)
  7.                 {
  8.                     BlockTableRecord btr = (BlockTableRecord)transaction.GetObject(btrID, OpenMode.ForWrite);
  9.                     if (btr.Name.ToUpper() == blockName.ToUpper())
  10.                     {
  11.                         return btr;
  12.                     }
  13.                 }
  14.                 return null;
  15.             }
1. Запускается транзакция, но нет ни transaction.Dispose() ни transaction.Commit()
2. Из метода возвращается BlockTableRecord, открытый в транзакции.

Т.е. нужно переделывать всё логику методов.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LucaАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 0
Re: Как поймать ошибку?
« Ответ #13 : 03-02-2020, 13:44:30 »
Как только Вы сказали, то я сразу нашел transaction.Commit, который не в тех операторных скобках.
У тебя в Common.cs  полный бред, который даже сложно комментировать.
Например,
Код - C# [Выбрать]
  1.             public static BlockTableRecord getBlockByNameFromDocument(string blockName)
  2.             {
  3.                 Transaction transaction = startTransaction();
  4.  
  5.                 BlockTable blockTable = (BlockTable)transaction.GetObject(database.BlockTableId, OpenMode.ForRead);
  6.                 foreach (ObjectId btrID in blockTable)
  7.                 {
  8.                     BlockTableRecord btr = (BlockTableRecord)transaction.GetObject(btrID, OpenMode.ForWrite);
  9.                     if (btr.Name.ToUpper() == blockName.ToUpper())
  10.                     {
  11.                         return btr;
  12.                     }
  13.                 }
  14.                 return null;
  15.             }
1. Запускается транзакция, но нет ни transaction.Dispose() ни transaction.Commit()
2. Из метода возвращается BlockTableRecord, открытый в транзакции.

Т.е. нужно переделывать всё логику методов.
метод  getBlockByNameFromDocument пока просто лежит, на будущее, я его не использую.
прям всё и переделывать?
в Common общие для методы и констаны для всех операций, типа получение транзакции, получение предварительного выбора и тд
теперь в следующей команде  AUTO_ELECTRO_CREATE_CABLE_LOG_  тоже Violation Access

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как поймать ошибку?
« Ответ #14 : 03-02-2020, 13:48:58 »
теперь в следующей команде  AUTO_ELECTRO_CREATE_CABLE_LOG_  тоже Violation Access
Никогда не храни открытые объекты/примитивы - храни их ObjectId. И открывай по мере надобности.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение