明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: caoyin

[原创] 出错处理的点滴经验

  [复制链接]
发表于 2009-1-14 12:40 | 显示全部楼层

我也用了,但是经常捕捉会丢失,是怎么回事呢?

(defun 111()
(error-init (list '("cmdecho" 0 "osmode" 0   ) 1 ))
......
(error-restore)
)

(defun error-init (lst / ss varl untag reset bar)
   (if (= 1 (logand 1 (getvar "pickfirst")))
     (progn
       (setq ss (ssgetfirst))
       (if (not (apply 'or ss)) (setq ss nil))
     )
   )
   (mapcar 'set '(varl untag reset bar) lst)
   (setq $lt-alive$ (if (not $lt-alive$) 1 (1+ $lt-alive$)))
   (if (and (> $lt-alive$ 1)
            (= "*LTErr*" (last $lt-error$))
       )
     (progn
       (setq *error* lt:error $lt-alive$ 1)
       (error-restore)
       (setq $lt-alive$ 1)
     )
   )
   (if (<= $lt-alive$ 0)
     (progn
       (setq $lt-alive$ 0)
       (error-restore)
       (setq $lt-alive$ 1)
     )
   )
   (if (= $lt-alive$ 1)
     (progn
       (setq $lt-olderror$ *error*)
       (if (or (not (listp $lt-error$))
               (/= "*LTErr*" (last $lt-error$))
           )
         (setq $lt-error$ (list "*LTErr*"))
       )
       (if (or (= (type (car $lt-error$)) 'list)
               (= "*LTErr*" (car $lt-error$))
           )
         (setq $lt-error$ (cons untag $lt-error$))
         (setq $lt-error$ (cons untag (cdr $lt-error$)))
       )
       (if untag
         (lt:undo-init T)
         (setq $lt-undoctl$ nil)
       )
     )
   )
   (sysvar-set (car lst))
   (if (= $lt-alive$ 1)
     (progn
       (setq *error* lt:error)
       (if reset (setq $lt-error$ (append (reverse (cdr (reverse $lt-error$)))
                                          (list reset (last $lt-error$))
                                  )
                 )
       )
     )
   )
   (if ss (apply 'sssetfirst ss))
)
(defun error-restore ()
   (setq $lt-alive$ (1- $lt-alive$)
         $lt-error$ (cons (car $lt-error$)
                          (reverse (cons (last $lt-error$)
                                         (cddr (reverse (cdr $lt-error$)))
                                   )
                          )
                    )
   )
   (if (>= $lt-alive$ 0)
     (lt:sysvar-restore)
     (setq $lt-varlist$ nil)
   )
   (if (<= $lt-alive$ 0)
     (progn
       (lt:undo-restore)
       (if $lt-olderror$ (setq *error* $lt-olderror$ $lt-olderror$ nil))
     )
   )
(if (null $zhl_os)(setq $zhl_os 767))
(if $zhl_os (setvar "osmode"  $zhl_os))
   (princ)
)

(defun sysvar-set (lst / lst3 a n b lst2)
   (setq lst3 (car $lt-varlist$) n -2)
   (repeat (/ (length lst) 2)
     (setq a    (strcase (nth (setq n (+ n 2)) lst))
           b    (nth (1+ n) lst)
           lst2 (append lst2 (list (list a (getvar a))))
     )
     (if (and $lt-varlist$ (not (assoc a lst3)))
       (setq lst3 (append lst3 (list (list a (getvar a)))))
     )
     (setvar a b)
   )
   (if $lt-varlist$
     (setq $lt-varlist$ (append (list lst3) (cdr $lt-varlist$) (list lst2)))
     (setq $lt-varlist$ (list lst2))
   )
)
(defun lt:undo-restore (/ x)
   (if $lt-undoctl$
     (progn
       (defun x (i val) (= (logand i val) i))
       (sysvar-set '("cmdecho" 0))
       (while (= 8 (logand 8 (getvar "undoctl"))) (command "_.undo" "_end"))
       (if (/= $lt-undoctl$ (getvar "undoctl"))
         (progn
           (cond
             ((= 0 $lt-undoctl$) (command "_.undo" "_control" "_none"))
             ((x 2 $lt-undoctl$) (command "_.undo" "_control" "_one"))
           )
           (if (x 4 $lt-undoctl$) (command "_.undo" "_auto" "_on"))
         )
       )
       (if (not (x 2 (getvar "undoctl"))) (lt:sysvar-restore))
       (setq $lt-undoctl$ nil)
     )
   )
)
(defun lt:undo-init (varset / x y z)
   (defun x () (getvar "undoctl"))
   (defun y (i) (= (logand i (x)) i))
   (sysvar-set '("cmdecho" 0))
   (setq z (x))
   (if (or (= (x) 0) (= (x) 16)) (command "_.undo" "_all"))
   (if (or (not (y 1)) (y 2)) (command "_.undo" "_control" "_all"))
   (if (y 4) (command "_.undo" "_auto" "_off"))
   (while (y 8) (command "_.undo" "_end"))
   (while (not (y 8)) (command "_.undo" "_begin"))
   (lt:sysvar-restore)
   (if (= varset T) (setq $lt-undoctl$ z) z)
)
(defun lt:sysvar-restore (/ lst)
   (if (<= $lt-alive$ 0)
     (setq lst (car $lt-varlist$) $lt-varlist$ (list lst))
     (setq lst (last $lt-varlist$))
   )
   (mapcar '(lambda (x) (apply 'setvar x)) lst)
   (setq $lt-varlist$ (reverse (cdr (reverse $lt-varlist$))))
)

 楼主| 发表于 2009-1-14 13:33 | 显示全部楼层
捕捉丢失,说明error函数的定义还是有问题——也就是说出错处理没有被激活
发表于 2009-1-14 17:36 | 显示全部楼层
出错处理怎样才能被激活?上面这段程序要怎么改呢?
发表于 2009-1-15 07:53 | 显示全部楼层
好东西,值得学习!
 楼主| 发表于 2009-1-15 13:54 | 显示全部楼层
本帖最后由 作者 于 2009-1-15 13:56:28 编辑

userzhl发表于2009-1-14 17:36:00出错处理怎样才能被激活?上面这段程序要怎么改呢?

;;写一个简单的示例

;;当程序出错,*error*函数则自动被激活执行,相关的恢复设置可定义在*error*函数中,如下面的红色部分

(defun c:tt (/ err os)
  (setq err *error*)           ;储存当前*error*函数定义
  (setq os (getvar "osmode"))  ;储存系统变量osmode当前值
  (setvar "osmode" 0)          ;关闭osmode
  (defun *error* (m)           ;自定义*error*函数
    (princ m)                  ;如果不需要打印出错信息这一行可以不要
    (setvar "osmode" os)       ;在出错的时候恢复osmode
  )
  (if (and (setq p1 (getpoint "\n指定直线第一点: "))
           (setq p2 (getpoint p1 "\n指定直线第二点(此时按ESC测试): "))
      )
    (command "_.line" p1 p2 "")
  )
  (setvar "osmode" os)         ;在未出错的时候恢复osmode
  (princ)
)

发表于 2009-2-3 14:47 | 显示全部楼层
非常详细,支持!
发表于 2009-2-3 15:15 | 显示全部楼层
怎么找不到这个函数 lt:entsel
 楼主| 发表于 2009-2-4 13:58 | 显示全部楼层
jxphklibin发表于2009-2-3 15:15:00怎么找不到这个函数 lt:entsel

http://bbs.mjtd.com/forum.php?mod=viewthread&tid=72404

见3楼

发表于 2009-2-4 21:07 | 显示全部楼层
有些函数缺少,请补上!
发表于 2009-2-5 21:55 | 显示全部楼层

谢楼主分享

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-2 20:23 , Processed in 3.079786 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表