Не перехватывается сообщение об ошибке.

Автор Тема: Не перехватывается сообщение об ошибке.  (Прочитано 9260 раз)

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

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

  • ADN Club
  • ***
  • Сообщений: 188
  • Карма: 2
День добрый!

Хочу перехватить сообщение об ошибке при выполнении команды следующим образом:
Код - Auto/Visual Lisp [Выбрать]
  1.                 (setq oldError *error*)
  2.                 (defun *error* ()
  3.                         (alert "Недостаточный зазор в опорном витке!\nПриложение будет аварийно завершено.")
  4.                         (exit)
  5.                 )
  6.                 (vl-cmdf "_.sweep" circ$ "" "_b" pt0 helix$)
  7.                 (setq *error* oldError)
  8.  

Проблема в том, что когда команда sweep не выполняется, то в текстовом экране появляется сообщение:
"Ошибка операции моделирования:
     Выполнение сдвига привело к созданию недопустимой поверхности.

Сдвиг 1 выбранных объектов невозможен."

Но при этом сообщение через функцию *error* не перехватывается и приложение работу не останавливает. В чем причина?

Заранее благодарен.
Леонид

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Возможно, причина в том, что это ошибка другого контекста, с которым не работает *error*.
Попробуйте еще заменить vl-cmdf на command (или command-s). Если не поможет - тогда увы.

Отмечено как Решение Балиев 18-05-2017, 14:33:10

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Проблема в том, что когда команда sweep не выполняется, то в текстовом экране появляется сообщение:
"Ошибка операции моделирования:
     Выполнение сдвига привело к созданию недопустимой поверхности.

Сдвиг 1 выбранных объектов невозможен."

Но при этом сообщение через функцию *error* не перехватывается и приложение работу не останавливает. В чем причина?
Такого рода ошибки не отлавливаются ни в одной функции обработки ошибок, но ты можешь сравнить значение (entlast) до выполнения команды и после неё.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 188
  • Карма: 2
Цитировать
Такого рода ошибки не отлавливаются ни в одной функции обработки ошибок, но ты можешь сравнить значение (entlast) до выполнения команды и после неё.
Да, это работает. Примерно так, если кому интересно:

Код - Auto/Visual Lisp [Выбрать]
  1.                 (vl-cmdf "_.sweep" circ$ "" "_b" pt0 helix$)
  2.                 (if (/= (cdr (assoc 0 (entget (entlast)))) "3DSOLID")
  3.                         (progn
  4.                                 (alert "Недостаточный зазор в опорном витке!\nПриложение будет аварийно завершено.")
  5.                                 (exit)
  6.                         ) ; end progn          
  7.                 ) ; end if
  8.  

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Да, это работает. Примерно так, если кому интересно:
Это если последний примитив перед запуском команды _.SWEEP был не 3DSOLID. Если логика программы такова, то всё нормально.
Но правильнее (универсальнее) так:
Код - Auto/Visual Lisp [Выбрать]
  1. (setq enlast (entlast))
  2. (vl-cmdf "_.sweep" circ$ "" "_b" pt0 helix$)
  3. (if (eq enlast (entlast))  ;; Исправил по замечанию Балиева
  4.   (progn
  5.       (alert "Недостаточный зазор в опорном витке!\nПриложение будет аварийно завершено.")
  6.       (exit)
  7.   ) ; end progn          
  8. ) ; end if
И это подходит для любой команды, которая создаёт примитивы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 188
  • Карма: 2
И это подходит для любой команды, которая создаёт примитивы.
Согласен. Но только вместо (if (/= enlast (entlast)) нужно (if (eq enlast (entlast)).

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Согласен. Но только вместо (if (/= enlast (entlast)) нужно (if (eq enlast (entlast)).
Согласен. Исправил код чтобы не вводить никого в заблуждение.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение