userzhl 发表于 2009-1-14 12:40:00

<p>我也用了,但是经常捕捉会丢失,是怎么回事呢?</p><p>(defun 111()<br/>(error-init (list '("cmdecho" 0 "osmode" 0&nbsp;&nbsp; ) 1 ))<br/>......<br/>(error-restore)<br/>)</p><p>(defun error-init (lst / ss varl untag reset bar)<br/>&nbsp;&nbsp; (if (= 1 (logand 1 (getvar "pickfirst")))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq ss (ssgetfirst))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (not (apply 'or ss)) (setq ss nil))<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp; )<br/>&nbsp;&nbsp; (mapcar 'set '(varl untag reset bar) lst)<br/>&nbsp;&nbsp; (setq $lt-alive$ (if (not $lt-alive$) 1 (1+ $lt-alive$)))<br/>&nbsp;&nbsp; (if (and (&gt; $lt-alive$ 1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (= "*LTErr*" (last $lt-error$))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq *error* lt:error $lt-alive$ 1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (error-restore)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq $lt-alive$ 1)<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp; )<br/>&nbsp;&nbsp; (if (&lt;= $lt-alive$ 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq $lt-alive$ 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (error-restore)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq $lt-alive$ 1)<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp; )<br/>&nbsp;&nbsp; (if (= $lt-alive$ 1)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq $lt-olderror$ *error*)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (or (not (listp $lt-error$))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (/= "*LTErr*" (last $lt-error$))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq $lt-error$ (list "*LTErr*"))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (or (= (type (car $lt-error$)) 'list)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (= "*LTErr*" (car $lt-error$))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq $lt-error$ (cons untag $lt-error$))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq $lt-error$ (cons untag (cdr $lt-error$)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if untag<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (lt:undo-init T)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq $lt-undoctl$ nil)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp; )<br/>&nbsp;&nbsp; (sysvar-set (car lst))<br/>&nbsp;&nbsp; (if (= $lt-alive$ 1)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq *error* lt:error)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if reset (setq $lt-error$ (append (reverse (cdr (reverse $lt-error$)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (list reset (last $lt-error$))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp; )<br/>&nbsp;&nbsp; (if ss (apply 'sssetfirst ss))<br/>)<br/>(defun error-restore ()<br/>&nbsp;&nbsp; (setq $lt-alive$ (1- $lt-alive$)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $lt-error$ (cons (car $lt-error$)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (reverse (cons (last $lt-error$)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (cddr (reverse (cdr $lt-error$)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp; )<br/>&nbsp;&nbsp; (if (&gt;= $lt-alive$ 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (lt:sysvar-restore)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq $lt-varlist$ nil)<br/>&nbsp;&nbsp; )<br/>&nbsp;&nbsp; (if (&lt;= $lt-alive$ 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (lt:undo-restore)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if $lt-olderror$ (setq *error* $lt-olderror$ $lt-olderror$ nil))<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp; )<br/>(if (null $zhl_os)(setq $zhl_os 767))<br/>(if $zhl_os (setvar "osmode"&nbsp; $zhl_os))<br/>&nbsp;&nbsp; (princ)<br/>)</p><p>(defun sysvar-set (lst / lst3 a n b lst2)<br/>&nbsp;&nbsp; (setq lst3 (car $lt-varlist$) n -2)<br/>&nbsp;&nbsp; (repeat (/ (length lst) 2)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq a&nbsp;&nbsp;&nbsp; (strcase (nth (setq n (+ n 2)) lst))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b&nbsp;&nbsp;&nbsp; (nth (1+ n) lst)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lst2 (append lst2 (list (list a (getvar a))))<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; (if (and $lt-varlist$ (not (assoc a lst3)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq lst3 (append lst3 (list (list a (getvar a)))))<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setvar a b)<br/>&nbsp;&nbsp; )<br/>&nbsp;&nbsp; (if $lt-varlist$<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq $lt-varlist$ (append (list lst3) (cdr $lt-varlist$) (list lst2)))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq $lt-varlist$ (list lst2))<br/>&nbsp;&nbsp; )<br/>)<br/>(defun lt:undo-restore (/ x)<br/>&nbsp;&nbsp; (if $lt-undoctl$<br/>&nbsp;&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (defun x (i val) (= (logand i val) i))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (sysvar-set '("cmdecho" 0))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (while (= 8 (logand 8 (getvar "undoctl"))) (command "_.undo" "_end"))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (/= $lt-undoctl$ (getvar "undoctl"))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (cond<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((= 0 $lt-undoctl$) (command "_.undo" "_control" "_none"))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((x 2 $lt-undoctl$) (command "_.undo" "_control" "_one")) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (x 4 $lt-undoctl$) (command "_.undo" "_auto" "_on"))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (not (x 2 (getvar "undoctl"))) (lt:sysvar-restore))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq $lt-undoctl$ nil)<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp; )<br/>) <br/>(defun lt:undo-init (varset / x y z)<br/>&nbsp;&nbsp; (defun x () (getvar "undoctl"))<br/>&nbsp;&nbsp; (defun y (i) (= (logand i (x)) i))<br/>&nbsp;&nbsp; (sysvar-set '("cmdecho" 0))<br/>&nbsp;&nbsp; (setq z (x))<br/>&nbsp;&nbsp; (if (or (= (x) 0) (= (x) 16)) (command "_.undo" "_all"))<br/>&nbsp;&nbsp; (if (or (not (y 1)) (y 2)) (command "_.undo" "_control" "_all"))<br/>&nbsp;&nbsp; (if (y 4) (command "_.undo" "_auto" "_off"))<br/>&nbsp;&nbsp; (while (y 8) (command "_.undo" "_end"))<br/>&nbsp;&nbsp; (while (not (y 8)) (command "_.undo" "_begin"))<br/>&nbsp;&nbsp; (lt:sysvar-restore)<br/>&nbsp;&nbsp; (if (= varset T) (setq $lt-undoctl$ z) z)<br/>)<br/>(defun lt:sysvar-restore (/ lst)<br/>&nbsp;&nbsp; (if (&lt;= $lt-alive$ 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq lst (car $lt-varlist$) $lt-varlist$ (list lst))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq lst (last $lt-varlist$))<br/>&nbsp;&nbsp; )<br/>&nbsp;&nbsp; (mapcar '(lambda (x) (apply 'setvar x)) lst)<br/>&nbsp;&nbsp; (setq $lt-varlist$ (reverse (cdr (reverse $lt-varlist$))))<br/>)</p>

caoyin 发表于 2009-1-14 13:33:00

捕捉丢失,说明error函数的定义还是有问题——也就是说出错处理没有被激活

userzhl 发表于 2009-1-14 17:36:00

出错处理怎样才能被激活?上面这段程序要怎么改呢?

大菜鸟 发表于 2009-1-15 07:53:00

好东西,值得学习!

caoyin 发表于 2009-1-15 13:54:00

本帖最后由 作者 于 2009-1-15 13:56:28 编辑 <br /><br /> userzhl发表于2009-1-14 17:36:00static/image/common/back.gif出错处理怎样才能被激活?上面这段程序要怎么改呢?

<p></p><p>;;写一个简单的示例</p><p>;;当程序出错,*error*函数则自动被激活执行,相关的恢复设置可定义在*error*函数中,如下面的红色部分</p><p>(defun c:tt (/ err os)<br/>&nbsp; (setq err *error*)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;储存当前*error*函数定义<br/>&nbsp; (setq os (getvar "osmode"))&nbsp; ;储存系统变量osmode当前值<br/>&nbsp; (setvar "osmode" 0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;关闭osmode<br/>&nbsp; (defun *error* (m)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;自定义*error*函数<br/>&nbsp;&nbsp;&nbsp; (princ m)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;如果不需要打印出错信息这一行可以不要<br/>&nbsp;&nbsp;&nbsp; <font color="#ff3300">(setvar "osmode" os)</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;在出错的时候恢复osmode<br/>&nbsp; )<br/>&nbsp; (if (and (setq p1 (getpoint "\n指定直线第一点: "))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq p2 (getpoint p1 "\n指定直线第二点(此时按ESC测试): "))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; (command "_.line" p1 p2 "")<br/>&nbsp; )<br/>&nbsp; (setvar "osmode" os)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;在未出错的时候恢复osmode<br/>&nbsp; (princ)<br/>)</p><p></p>

jxphklibin 发表于 2009-2-3 14:47:00

非常详细,支持!

jxphklibin 发表于 2009-2-3 15:15:00

怎么找不到这个函数 lt:entsel

caoyin 发表于 2009-2-4 13:58:00

jxphklibin发表于2009-2-3 15:15:00static/image/common/back.gif怎么找不到这个函数 lt:entsel

<p><a href="http://bbs.mjtd.com/forum.php?mod=viewthread&tid=72404">http://bbs.mjtd.com/forum.php?mod=viewthread&tid=72404</a></p><p>见3楼</p>

jxphklibin 发表于 2009-2-4 21:07:00

有些函数缺少,请补上!

7607155 发表于 2009-2-5 21:55:00

<p>谢楼主分享</p>
页: 1 2 3 [4] 5 6
查看完整版本: [原创] 出错处理的点滴经验