若是系统错误,我想可能没有办法,因为系统出错,它就直接调用错误处理函数了。
但一般函数出错都是调用时变量有问题,这里我们可以加一个容错处理点。
在函数开始处用一个变量判断点,来判断传入的变量是否是你需要的变量类型、值范围等。若是则继续,若变量达不到要求,则跳至函数尾并返回一个值(逻辑假或负值。。。等与函数正常值不一样就行)

- ;;;====================================================
- (defun setclayer (slist / cname cor ctmp tmp lsty)
- ;;出错后帮助提示信息
- (setq ctmp (strcat "\n(setclayer '(层名 颜色))!"
- "\n(setclayer "轴线")设置当前图层"
- ) ;_ end of strcat
- ) ;_ end of setq
- ;;若变量是表则
- (cond ((= (type slist) 'LIST)
- (setq cname (car slist)
- cor (cadr slist)
- lsty (caddr slist)
- ) ;_ end of setq
- (if (not lsty)(setq lsty "CONTINUOUS"))
- )
- ((= (type slist) 'STR)
- (setq cname slist)
- )
- ) ;_ end of cond
- ;;若是用问号调用则直接显示帮助
- (cond ((= slist '?)
- (alert ctmp)
- )
- ;若变量不是表则。
- ((not slist)
- (if clayer_old
- (setvar "clayer" clayer_old)
- (setvar "clayer" "0")
- ) ;_ end of if
- )
- ((and cname cor (= (type cname) 'STR) (= (type cor) 'INT))
- (if (and (tblobjname "LAYER" cname)
- (setq tmp (entget (tblobjname "LAYER" cname)))
- ) ;_ 结束and
- (progn (setq tmp (subst (cons 62 cor)
- (assoc 62 tmp)
- tmp
- ) ;_ 结束subst
- tmp (subst (cons 70 0) (assoc 70 tmp) tmp)
- ) ;_ 结束setq
- (entmod tmp)
- ) ;_ 结束progn
- (entmake (list
- '(0 . "LAYER")
- '(100 . "AcDbSymbolTableRecord")
- '(100 . "AcDbLayerTableRecord")
- (cons 6 lsty)
- (cons 62 cor)
- '(70 . 0)
- (cons 2 cname)
- ) ;_ end of list
- ) ;_ end of entmake
- ) ;_ end of if
- (setq clayer_old (getvar "clayer"))
- (setvar "clayer" cname)
- )
- ((and (= (type cname) 'STR))
- (if (setq tmp (entget (tblobjname "LAYER" cname)))
- (progn (setvar "clayer" cname)
- (setq tmp (subst (cons 62 cor)
- (assoc 62 tmp)
- tmp
- ) ;_ 结束subst
- tmp (subst (cons 70 0) (assoc 70 tmp) tmp)
- ) ;_ 结束setq
- (entmod tmp)
- ) ;_ 结束progn
- (progn (entmake (list
- '(0 . "LAYER")
- '(100 . "AcDbSymbolTableRecord")
- '(100 . "AcDbLayerTableRecord")
- (cons 6 lsty)
- (cons 62 7)
- '(70 . 0)
- (cons 2 cname)
- ) ;_ end of list
- ) ;_ end of entmake
- ) ;_ end of progn
- ) ;_ end of if
- (setq clayer_old (getvar "clayer"))
- (setvar "clayer" cname)
- )
- ;;若变量不对,则出现提示
- (T (progn (alert (strcat "\n数据错误:" ctmp))))
- ) ;_ end of cond
- (princ)
- ) ;_ end of defun
这上面就使用了若错误使用变量调用时的容错方式,当调用变量不是我所需要的格式时,将出现提示,之后程序继续执行。
上面的程序是我几年前编的,当时是想能让一个函数使用不同的变量格式调用。
且若变量不对的情况可以继续执行,主要用来调试程序时用,当所有程序调试完后,再将其中判断语句注释掉。
后改正过很多BUG,但源码不在这台机子上。呵呵^_^ |