明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3727|回复: 17

求*ERROR*函数指导

  [复制链接]
发表于 2011-10-5 21:40 | 显示全部楼层 |阅读模式
请教*error*函数的用法,研究了两天,还是不行.好象有时可以成功跳出一次,不出现致命错误,99%的机会致命错误.蓝色这句,由于PTT5变量引用的花纹名,在CAD花纹库中没有时,CAD就会出现致命错误.我加入了上面红色和绿色的两段,为什么总要出现致命错误,而不去执行绿色这段.(defun c:tc()(vl-catch-all-error-p    (vl-catch-all-apply;关闭对象捕捉,否则出错(command "-osnap" "off");(setq pt10 (getvar "useri1"))第1个点X坐标(setq pt11 (getvar "userr1"))(setq pt1 (list 116 pt11))
;(setq pt20 (getvar "useri2"))第2个点X坐标(setq pt21 (getvar "userr2"))(setq pt2 (list 116 pt21))
;(setq pt30 (getvar "useri3"))第3个点X坐标;(setq pt31 pt21)(setq pt3 (list 135 pt21))
;(setq pt40 (getvar "useri4"))第4个点X坐标;(setq pt41 pt11)(setq pt4 (list 135 pt11))
(setq ptt5 (getvar "users5"))(command "pline" pt1 pt2 pt3 pt4 "c")(command "_hatch" ptt5 "" "" (entlast) "");打开对象捕捉的端点、交点(command "-osnap" "end,int")(princ)) ))

;加入下面这段,就实现了容错处理,类似VBA中的On Error Resume Next,可以放在任意位置
(defun *error* (msg)
(exit)
(vl-exit-with-error (strcat "My application bombed! " msg))
)




麻烦知道的指导两句,谢谢

点评

*error*是系统错误处理函数  发表于 2011-10-5 22:42
发表于 2011-10-5 22:39 | 显示全部楼层
本帖最后由 cabinsummer 于 2011-10-7 22:24 编辑

  1. (defun c:tc()
  2.   (setq os (getvar "osmode"))
  3.   (setvar "osmode" 0)
  4.   (setq olderr *error* *error* myerr)
  5.   (setq pt11 (getvar "userr1"))
  6.   (setq pt1 (list 116 pt11))
  7.   (setq pt21 (getvar "userr2"))
  8.   (setq pt2 (list 116 pt21))
  9.   (setq pt31 pt21)
  10.   (setq pt3 (list 135 pt21))
  11.   (setq pt41 pt11)
  12.   (setq pt4 (list 135 pt11))
  13.   (setq ptt5 (getvar "users5"))
  14.   (command "pline" pt1 pt2 pt3 pt4 "c")
  15.   (command "_hatch" ptt5 "" "" (entlast) "")
  16.   (myerr)
  17. )

  18. (defun myerr (msg)
  19.   (setvar "osmode" os)
  20.   (setq *error* olderr)
  21.   (princ)
  22. )
发表于 2011-10-5 23:39 | 显示全部楼层
本帖最后由 caoyin 于 2011-10-5 23:46 编辑

(defun C:TT (/ *ERROR* OS PT1 PT2 PT3 PT4);;可以把*ERROR*放在这里,这时候函数内外的
                                          ;;*ERROR*就区别开了,跟独立名称空间的概念一样
  ;;*ERROR*和其他函数最重要的区别就是参数的传递是系统
  ;;自动完成的,而不是我们任意制定的。参数MSG是系统打印的错误信息。
  ;;之所以大家要重定义*ERROR*,1.修改MSG或者不打印MSG。
  ;;2.执行自定义出错恢复的相关代码,如下面的例子(or OS (setqvar "osmode" os))
  ;;就是我想在出错后还原OSMODE的值
  (defun *ERROR* (MSG)
    (if OS (setqvar "osmode" os))
  )
  (setq os (getvar "osmode"))
  (setvar "osmode" 0)
  (setq PT1 (getpoint "\n第一点: "));;--
  (setq PT2 (getpoint "\n第一点: "));;  |------这四行代码
  (setq PT3 (getpoint "\n第三点: "));;  |      执行过程中如果按ESC,程序就不会往下执行,而
  (setq PT4 (getpoint "\n第四点: "));;--       是自动激活*ERROR*
  (command "_.pline" pt1 pt2 pt3 pt4 "c")
  (setqvar "osmode" os);;这一行是在不出错的情况下执行的。
  (princ)
)
发表于 2011-10-5 23:45 | 显示全部楼层
本帖最后由 caoyin 于 2011-10-5 23:48 编辑

;;;原理跟上面一样,其实很多人把*ERROR*想得复杂了
(defun C:TT2 (/ OS PT1 PT2 PT3 PT4)
  (vl-catch-all-apply
  '(lambda()
  (setq os (getvar "osmode"))
  (setvar "osmode" 0)
  (setq PT1 (getpoint "\n第一点: "))
  (setq PT2 (getpoint "\n第一点: "))
  (setq PT3 (getpoint "\n第三点: "))
  (setq PT4 (getpoint "\n第四点: "))
  (command "_.pline" pt1 pt2 pt3 pt4 "c")
  )
  )
  ;;以上11行,在任一点上ESC中断,则接着执行以下部分
(if OS (setqvar "osmode" os))
  (princ)
)
 楼主| 发表于 2011-10-6 00:55 | 显示全部楼层
本帖最后由 zoubo604 于 2011-10-6 01:11 编辑
cabinsummer 发表于 2011-10-5 22:39

十分感谢你,用了你写的代码,果然不出错了.我还有几个问题请教一下:
1,(setq olderr *error* *error* myerr)这句什么意思,怎么有两个*error*
2,最后一个函数,(defun myerr (msg)
  (setqvar "osmode" os)
  (setq *error* olderr)
  (princ)
)
其中,(setq *error* olderr)这句是什么作用?
3,为什么我用一个循环,循环6次的(循环在VBA里,来调用TC 6次),应该前3次不出错的,花纹名可以填充,第4次的花纹名,花纹库里没有,应该在这次以后不填充.结果却是6次都没有填充.
4\你写这个ERROR函数是遇错继续执行,还是遇错结束程序,不崩溃?哪句能看出是遇错继续.5\(myerr)这句,要放在错误的后面吗?如果不知道哪句出错,是放在最前还是最后呢?

我又看了两遍你写的代码,我的理解是,如果出错了,不考虑还原捕捉设置及还原出错前的状态,好几句都可以省.关键是这(myerr)句.和
最后一个函数,是不是中间的内容都可以省了啊.只保留前后两句,如下
(defun myerr (msg)
)我这样的理解是否正确,请指正,谢谢.

 楼主| 发表于 2011-10-6 01:21 | 显示全部楼层
caoyin 发表于 2011-10-5 23:45
;;;原理跟上面一样,其实很多人把*ERROR*想得复杂了
(defun C:TT2 (/ OS PT1 PT2 PT3 PT4)
  (vl-catch-a ...

感谢你的回答,备注得相当清楚,只是我的理解还有问题.
(defun C:TT (/ *ERROR* OS PT1 PT2 PT3 PT4)

这样的开头,理解不了.吃力.第一段,你是把ERROR函数写到TT函数内了吗?
(defun *ERROR* (MSG)
    (if OS (setqvar "osmode" os))
  )
就是这段好象你写到TT里面了.意思是如果出错,就还原对象捕捉设置吗?如果我不需要还原设置呢,这句可以不要吗.只保留(defun *ERROR* (MSG))

第二段(vl-catch-all-apply是什么意思啊,后面一个括号一直到最后,把后面的内容全括进来,是吗?
第二段的开头(defun C:TT2 (/ OS PT1 PT2 PT3 PT4)比第一段少了个*ERROR*,把(if OS (setqvar "osmode" os))
  (princ)
)
放在TT2的外面了.是这样吗?另外,(princ)到底是个什么意思啊.
 楼主| 发表于 2011-10-6 01:33 | 显示全部楼层
本帖最后由 zoubo604 于 2011-10-6 01:35 编辑

还有个问题,我试图在这里加一句提示语句,提示语句却不出来.为什么呢?
(defun myerr (msg)
  (setqvar "osmode" os)
  (setq *error* olderr)
  (alert "部分花纹在CAD花纹库中没有,导致花纹填充失败,请注意查看花纹库,并改换填充花纹")
  (princ)
)貌似这个错误处理函数是遇错继续执行后续语句的.因为后面我写的另一句"绘图成功"的提示都出来了.但红色这句提示怎么不出来呢
发表于 2011-10-6 05:40 | 显示全部楼层
本帖最后由 cabinsummer 于 2013-12-25 21:17 编辑
zoubo604 发表于 2011-10-6 00:55
十分感谢你,用了你写的代码,果然不出错了.我还有几个问题请教一下:
1,(setq olderr *error* *error* mye ...

(setq olderr *error* *error* myerr)就是
(setq olderr *error*);;;保存系统错误处理函数
(setq *error* myerr);;;定义系统错误处理函数为自己的
(setq *error* olderr);;;出错时,要恢复到以前的系统错误函数
程序本身是遇错结束程序,在结束前恢复以前的环境设置。你要这样理解,任何程序错误,系统都会调用*error*函数,但是默认的*error*函数不一定是我们需要的,所以在程序开始,需要将以前的*error*用olderr保存起来,然后再将 *error*定义为自己的错误处理函数。自己定义的函数中本书要有恢复以前的变量和恢复以前的*error*。程序最后一句(myerr)意思是在结束时恢复环境变量和以前的*error*,即使正常结束也要这样做。
发表于 2011-10-6 08:19 | 显示全部楼层
zoubo604 发表于 2011-10-6 01:21
感谢你的回答,备注得相当清楚,只是我的理解还有问题.
(defun C:TT (/ *ERROR* OS PT1 PT2 PT3 PT4)

再详细就很难描述了,多测试、多比较,如果不懂就先把用法记住,久了就明白了
 楼主| 发表于 2011-10-6 15:10 | 显示全部楼层
好.感谢你们两位.后面只有靠自己体会了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-29 01:59 , Processed in 0.238324 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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