找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2408|回复: 8

[原创] 处女作:关于错误处理----其实可以不写

[复制链接]

已领礼包: 685个

财富等级: 财运亨通

发表于 2014-4-13 00:38:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 ysq101 于 2014-4-13 00:44 编辑

处女作:
关于错误处理,BBS上有很多这类型的主题
下面来点新手的见解:
众所周知,大程序需要做得更人性化,就必须加入错误处理
但是小程序呢.其实可以不写,这里面有点小技巧   也许大师们早发现了
我比较迟钝,现在才发现,现如今分享出来,希望对大家有一点点用

先来说说小程序
例子:
(defun c:tt ()
;用户输入
(setq ss (ssget))
(setq pt (getpoint))
(setq a (getreal))

   ;更改系统变量
   (setvar "cmdecho" 0)
(setvar "********" **)
;程序代码
   ("command" "undo" "be")
.......
.......
.......
   ("command" "undo" "e")

;还原系统变量

(setvar "cmdecho" 1)
)


发现规律了吗??

ssget getpoint getreal  等等需要用户输入的代码都放最前面
然后再  改变系统变量   (关捕捉等....)
再写    处理图元代码
再    还原系统变量

先来模拟一下用户的操作:

第一步:选择对像   -----哎,选错了  ESC强退程序  重新选                        程序中断,后面的代码没被执行
第二步:指定一个点 -----咦,点错了  ESC强退程序  重来                          程序中断,后面的代码没被执行
第三步:输入一个数 -----哎,输入的数值错得太多,懒得删, ESC强退程序   程序中断,后面的代码没被执行第四步:程序自动完成 (小程序速度太快)   用户没有机会按ESC强退程序



用户也只能在第三步前人为的终止程序
后来用户即使发现之前输入错误时也没办法了,,,只能是让程序执行完再UNDO了


嘻嘻,这样是不是就不用写错误处理了??
以上只是新手见解
望高手指点

大程序就让大师们来补充了

题外话:
之前就是用别人的程序没写误处理
系统变量被改得面目前非而且还不知道他改了些什么系统变量
尤其是UDNO 经常没有END 没法回退
所以要自己学LISP



评分

参与人数 1D豆 +10 贡献 +1 收起 理由
XDSoft + 10 + 1 技术引导讨论和指点奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2014-4-13 02:03:21 | 显示全部楼层
本帖最后由 Free-Lancer 于 2014-4-13 02:05 编辑

综合到一起给大家一个完整版的 *error* 处理机制,这些函数大都来源于网络,只是稍加整理通用化了,可以作为 A/Vlisp 程序的错误处理机制的终极版本
  1. ;; *error*
  2. (defun fy:error        (msg)
  3.   (if (and msg (/= msg "Function cancelled"))
  4.     (prompt (strcat "Error: " msg))
  5.     (princ)
  6.   )
  7.   (fy:end)
  8.   (princ)
  9. )
  10. ;;start progam
  11. (defun fy:begin        ()
  12.   (setq        olderr        *error*
  13.         *error*        fy:error
  14.   )
  15.   (fy:Clearcset)
  16.   (fy:startundo)
  17.   t
  18. )
  19. ;;progame end
  20. (defun fy:end ()
  21.   (fy:unsetv)
  22.   (setq        *error*        olderr
  23.         *sysvars* nil
  24.   )
  25.   (if *FyGlobleSym*
  26.     (progn
  27.       (if (vl-symbolp (car *FyGlobleSym*))
  28.         (foreach x *FyGlobleSym* (set x nil))
  29.         (foreach x *FyGlobleSym* (set (read x) nil))
  30.       )
  31.       (setq *FyGlobleSym* nil)
  32.     )
  33.   )
  34.   (fy:endundo)
  35.   (princ)
  36. )
  37. ;;push sysvar
  38. (defun fy:setv (name value / oldval)
  39.   (setq oldval (getvar name))
  40.   (if (not (assoc name *sysvars*))
  41.     (setq *sysvars* (append *sysvars* (list (cons name oldval))))
  42.   )
  43.   (setvar name value)
  44.   oldval
  45. )
  46. ;;Restore sysvar
  47. (defun fy:unsetv ()
  48.   (foreach v *sysvars* (setvar (car v) (cdr v)))
  49. )
  50. ;;ActiveDocument
  51. (defun Fy:acDoc        nil
  52.   (eval        (list 'defun
  53.               'FY:acdoc
  54.               'nil
  55.               (vla-get-activedocument (vlax-get-acad-object))
  56.         )
  57.   )
  58.   (fy:acdoc)
  59. )
  60. ;;StartUndo Mark
  61. (defun fy:StartUndo ()
  62.   (vla-startundomark (fy:acdoc))
  63. )
  64. ;;EndUndo Mark
  65. (defun fy:EndUndo ()
  66.   (vla-endundomark (fy:acdoc))
  67. )
  68. ;;ActiveSelectionSets
  69. (defun fy:acsets nil
  70.   (eval        (list 'defun
  71.               'fy:acsets
  72.               'nil
  73.               (vla-get-Selectionsets (fy:acdoc))
  74.         )
  75.   )
  76.   (fy:acsets)
  77. )
  78. ;; From eachy
  79. (defun fy:Clearcset (/ cset)
  80.   (if (not (vl-catch-all-error-p
  81.              (setq cset
  82.                     (vl-catch-all-apply
  83.                       'vla-item
  84.                       (list
  85.                         (fy:acsets)
  86.                         "CURRENT"
  87.                       )
  88.                     )
  89.              )
  90.            )
  91.       )
  92.     (vla-delete cset)
  93.   )
  94.   (princ)
  95. )


使用方法

程序起始
(fy:begin);_完成初始化,标记 Undo
...
(fy:setv "cmdecho" 0);_程序中用这个函数替代 setvar,功能是仅保存系统变量的初始状态,后面可以根据需要再次对同一系统变量进行设置,但以后的设置仅仅是 setvar , 不会再保存该系统变量,类似 xdrx_sysvar_push ,堆栈概念;同时完成 ActiveX 中的 ActiveSelectionSet 的初始化
...
(fy:end);_程序结束,恢复保存的系统变量至程序运行前状态,程序运行编组结束

以上代码就是 app.fas 中的部分,编译版可以在下方签名链接下载

点评

我的宗旨是偷懒不用写哈  详情 回复 发表于 2014-4-13 12:55
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-4-13 02:12:49 | 显示全部楼层
简单程序可以用 vl-catch-all-apply 进行包裹,不写 *error* 部分

点评

谢谢指点....回去试试  详情 回复 发表于 2014-4-13 12:56
还是你的这个办法好,赞!  详情 回复 发表于 2014-4-13 10:36
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 394个

财富等级: 日进斗金

发表于 2014-4-13 10:23:13 | 显示全部楼层
这个要支持一下,方法不错.

点评

谢谢支持~~~~  详情 回复 发表于 2014-4-13 12:54
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2014-4-13 10:36:15 来自手机 | 显示全部楼层
st788796 发表于 2014-4-13 02:12
简单程序可以用 vl-catch-all-apply 进行包裹,不写 *error* 部分

还是你的这个办法好,赞!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 685个

财富等级: 财运亨通

 楼主| 发表于 2014-4-13 12:54:55 | 显示全部楼层
kwok 发表于 2014-4-13 10:23
这个要支持一下,方法不错.

谢谢支持~~~~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 685个

财富等级: 财运亨通

 楼主| 发表于 2014-4-13 12:55:40 | 显示全部楼层
Free-Lancer 发表于 2014-4-13 02:03
综合到一起给大家一个完整版的 *error* 处理机制,这些函数大都来源于网络,只是稍加整理通用化了,可以作 ...

我的宗旨是偷懒不用写哈
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 685个

财富等级: 财运亨通

 楼主| 发表于 2014-4-13 12:56:54 | 显示全部楼层
st788796 发表于 2014-4-13 02:12
简单程序可以用 vl-catch-all-apply 进行包裹,不写 *error* 部分

谢谢指点....回去试试

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2022-12-18 17:32:23 | 显示全部楼层
感谢大佬分享,学习了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-22 06:54 , Processed in 0.182833 second(s), 46 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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