| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Как сделать обработку ошибки файлов при автозагрузке?

Lisp. Как сделать обработку ошибки файлов при автозагрузке?

Ответ
Поиск в этой теме
Непрочитано 13.01.2017, 10:14 #1
Lisp. Как сделать обработку ошибки файлов при автозагрузке?
Composter
 
Отопление и вентиляция
 
Москва
Регистрация: 31.10.2008
Сообщений: 445

Добрый день. У меня сделано так что в автозагрузке стоит 1 файл, а внем уже прописаны пути загрузки других файлов. Иногда после внесения правок может в файле остаться что то лишнее и в реультате файл не погружается.
я решил не просто сделать (load "filename") а обработку
Код:
[Выделить все]
 (defun load_lisp ( file_name / )
	(if 
		(vl-catch-all-error-p(vl-catch-all-apply '(lambda () (load file_name))))
		(princ (strcat "\n внутри файла " file_name " ошибка \n"))
	)
(princ)
)
и лиспы стал подгражсть соответсвенно
Код:
[Выделить все]
 (load_lisp "pl_obj-filter-select-all.lsp")
но дело в том что если вручную погрузить файл с ошибкой таким образом (после окончания всех автозагрузок) , то он выдаст строку что в файле ошибка. а если в автозагрузке то он попытаеся его подгрузить и напишет что то вроде "bad function" (я намерянно вставил в файл строку(+1 "5"))и что самое главное подгрузка дальнейших файлов прекращается.
Можно ли сделать чтобы автозагрузка не прерывалась и выводилась строка об ошибке в файле?
Просмотров: 1600
 
Непрочитано 13.01.2017, 11:14
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


У функции load есть второй параметр:
Цитата:
(load filename [onfailure])

filename
Type: String
Name of the AutoLISP file to load. If the filename argument does not specify a file extension, load adds an extension to the name when searching for a file to load. The function will try several extensions, if necessary, in the following order: .vlx .fas .lsp
NOTE:VLX files are supported on Windows only.
As soon as load finds a match, it stops searching and loads the file.
The filename can include a directory prefix, as in c:/function/test1 (Windows) or /function/test1 (Mac OS). A forward slash (/) or two backslashes (\\) are valid directory delimiters. If you don't include a directory prefix in the filename string, load searches the AutoCAD library path for the specified file. If the file is found anywhere on this path, load then loads the file.

onfailure
Type: String
A value returned if load fails.
If the onfailure argument is a valid AutoLISP function, it is evaluated. In most cases, the onfailure argument should be a string or an atom. This allows an AutoLISP application calling load to take alternative action upon failure.
Соответственно вариант 1:
Код:
[Выделить все]
 (defun rr1 (/ path lst file)
  (setq path "c:\\lisp"
        lst  '("lsp1.lsp" "1\\lsp2.lsp")
        ) ;_ end of setq
  (foreach file lst
    (if (setq file (findfile (strcat (vl-string-right-trim "\\" path) "\\" (vl-string-left-trim "\\" file))))
      (load file (strcat "File " file " contains errors"))
      ) ;_ end of if
    ) ;_ end of foreach
  ) ;_ end of defun
И вариант 2:
Код:
[Выделить все]
 (defun rr2 (/ path lst file err)
  (setq path "c:\\lisp"
        lst  '("lsp1.lsp" "1\\lsp2.lsp")
        ) ;_ end of setq
  (foreach file lst
    (if (setq file (findfile (strcat (vl-string-right-trim "\\" path) "\\" (vl-string-left-trim "\\" file))))
      (if (vl-catch-all-error-p (setq err (vl-catch-all-apply (function (lambda () (load file))))))
        (princ (strcat "\nFile " file " loading error:" (vl-catch-all-error-message err)))
        ) ;_ end of if
      ) ;_ end of if
    ) ;_ end of foreach
  ) ;_ end of defun
Попробуй, какой больше понравится и подойдет.

----- добавлено через 15 сек. -----
Код не проверял, написан "насухую" и на коленке
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.01.2017, 11:40
#3
Composter

Отопление и вентиляция
 
Регистрация: 31.10.2008
Москва
Сообщений: 445


rr1 вобще не работает, результат файла с ошибкой - ошибка "; error: bad function: 1"
rr2 выдает строку на файл с ошибкой - но если запихнуть комманду (rr2) в мой файл автозапуска то результат прежний - как и в моем лиспе "bad function: 1"

значение [onfailure] команда выдает только если не может найти файл, если же файл есть но внутри его косяк, то значение [onfailure] не появится.

попробуйте подгрузить лисп файл у котрого будет только одна строка (+1 "5")
Composter вне форума  
 
Непрочитано 13.01.2017, 11:57
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


rr2 у меня сработал. Подобная конструкция у меня используется уже не меньше 5 лет - пока нареканий не было. Правда, у меня подходы к созданию функций могут не совпадать с теми, которые используешь ты.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.01.2017, 12:08
#5
Composter

Отопление и вентиляция
 
Регистрация: 31.10.2008
Москва
Сообщений: 445


ну у меня 1 файл в атозагрузке Zod_autoload.lsp , вот его содержимое
Код:
[Выделить все]
(vl-load-com)

(defun rr2 (/ path lst file err)
  (setq path "Q:\\Работа\\Полезное для работы\\AVTOCAD'z modzzz"
        lst  '("Zod_lastload.lsp" )
        ) ;_ end of setq
  (foreach file lst
    (if (setq file (findfile (strcat (vl-string-right-trim "\\" path) "\\" (vl-string-left-trim "\\" file))))
      (if (vl-catch-all-error-p (setq err (vl-catch-all-apply (function (lambda () (load file))))))
        (princ (strcat "\nFile " file " loading error:" (vl-catch-all-error-message err)))
        ) ;_ end of if
      ) ;_ end of if
    ) ;_ end of foreach
) ;_ end of defun

(rr2)

(princ "\n файл Zod_lisp успешно загружен \n")
вот содержимое Zod_lastload.lsp
Код:
это результат открытия нового файла после презагрузки автокада
Код:
[Выделить все]
bad function: 1
если же строку (rr2) закоменинтить в файле Zod_autoload.lsp то результат
Код:
[Выделить все]
 файл Zod_lisp успешно загружен
если же вручную запустить (rr2) , то результат строка
Код:
[Выделить все]
File Q:\Работа\Полезное для работы\AVTOCAD'z modzzz\Zod_lastload.lsp loading error:bad function: 1"\nFile Q:\\Работа\\Полезное для работы\\AVTOCAD'z modzzz\\Zod_lastload.lsp loading error:bad function: 1"
подобной конструкций можно успешно пользоваться если нет ошибок в файле, а вот если есть то у меня не выходит.
Composter вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Как сделать обработку ошибки файлов при автозагрузке?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработка ПОС, искусство проектирования Tyhig Технология и организация строительства 117 25.11.2021 17:38
как сделать твердотельную модель и сделать ее чертеж, потом перенести в солидворкс denya43 AutoCAD 5 24.12.2012 18:42
Lisp. Не вставляет значения в базу access. Zaghim LISP 2 11.07.2012 14:29
{Конкурс} Lisp. Задачки для студентов gomer LISP 10 05.01.2011 16:33
Запуск Lisp команды в новом документе BlackHarp LISP 1 26.03.2009 23:06