明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 9901|回复: 27

[讨论] [原创]巧用出错,让你的程序更优雅。

  [复制链接]
发表于 2009-11-23 21:36:00 | 显示全部楼层 |阅读模式
出错程序就自然中断,再常见不过!
又没有想过好好利用一下呢?
下面用就好好利用出错中断的特性包装成两个函数!
  1. ;;无声退出
  2. (defun fsxm-silenceexit (/ *error*)
  3.   (t (setq *error* strcat))
  4. )
解说fsxm-silenceexit
这个是我最常用到的一个函数了!
有了它,代码会更优雅!
比如最常用的结构
  1. (defun c:test ()
  2.   (setq ss (ssget))
  3.   (if ss
  4.     (progn
  5.      ........主程序模块........
  6.     )
  7.   )
  8. )
  9. ;;使用fsxm-silenceexit的
  10. (defun c:test ()
  11.   (setq ss (ssget))
  12.   (or ss (fsxm-silenceexit))
  13.   ........主程序模块........
  14. )
绝大多数要求用户输入,都要检查数据合法性。
这样处理去了一层难看的括号,程序条理更分明!
  1. ;;带return的apply
  2. (defun Fsxm-Apply ($Sym $Lst / $$ return $rt)
  3.   (defun Return (var) (setq Return nil) (setq $$ var) (exit))
  4.   (setq $rt (vl-catch-all-apply $Sym $Lst))
  5.   (if Return $rt $$)
  6. )
解说Fsxm-Apply
一般说来Lisp的函数,只能一路执行到底,返回函数最后一个表达式的值。
试试Fsxm-Apply!集成一个类似于C语言的return功能!让你随时随地的结束函数,返回值!
特别应用就是在深层递归中退出。
如下例:找到第一个适合的文件就能立刻退出
用法:
(fsxm-searchfile 目录 文字样板 限时)
(fsxm-searchfile "c:" "*.lsp" 10)
  1. ;;查找一个文件
  2. (defun fsxm-searchfile (path pate time / t0 t1 dir)
  3.   (defun dir (paths / find lst paths2 strcat_ph)
  4.     (defun strcat_ph (lst)
  5.       (mapcar '(lambda (a) (strcat ph "\" a)) lst)
  6.     )
  7.     (while paths
  8.       (setq paths2 nil)
  9.       (foreach ph paths
  10. (if (> (getvar "TDUSRTIMER") t1)
  11.    (return nil)
  12. )    ;超时退出
  13. (if (setq find (vl-directory-files ph pate))
  14.    (return (strcat ph "\" (car find)))
  15. )    ;找到退出
  16. (if (and (setq lst (vl-directory-files ph nil -1))
  17.    (if (= (car lst) ".")
  18.      (setq lst (cddr lst))
  19.      t
  20.    )
  21.      )
  22.    (setq paths2 (cons (strcat_ph lst) paths2))
  23. )
  24.       )
  25.       (setq paths (apply 'append paths2))
  26.     )
  27.   )
  28.   (setq path (list path))
  29.   (setq t0 (getvar "TDUSRTIMER"))
  30.   (setq t1 (+ t0 (/ time 86400.0)))
  31.   (fsxm-apply 'dir (list path))
  32. )
注:FSTL各版本的函数库都收录有以上函数。

评分

参与人数 3明经币 +4 收起 理由
lidaxiu + 1 很给力!
raimo + 1 赞一个!
Longfin + 2 【好评】好文章

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2009-11-23 21:54:00 | 显示全部楼层

自已做程序時都沒做出錯部分處理,程序運行後出錯了就按Esc鍵顯示一堆錯誤提示,太現眼了,現在可以借鑒樓上方式了!感謝樓主分享!!!

发表于 2009-11-25 08:55:00 | 显示全部楼层

占个位子学习一下。

很漂亮的除错语句。

发表于 2009-12-3 15:55:00 | 显示全部楼层
版主的水平就是不一样
发表于 2009-12-13 20:50:00 | 显示全部楼层
不错,可免得没有出错程序而引起的不爽,谢谢分享,有时间时也试试!
发表于 2010-6-5 14:22:00 | 显示全部楼层
谢谢 楼主  辛苦了!!!!
发表于 2010-6-5 14:30:00 | 显示全部楼层
我啥时候才能有这水平啊!
发表于 2010-9-3 20:19:00 | 显示全部楼层
谢谢楼主,呵呵, 我把这个方法推广到国外去了。
举了一个例子:
  1. (defun c:test()
  2.   (fsxm-apply 'func '((1 2 3 4 7 9 5 6 7 8 9)))
  3. )
  4. ;;
  5. (defun func (lst / i)
  6.   (setq i 0)
  7.   (foreach n lst
  8.     (if (= n 5)
  9.       (return  i)
  10.     )
  11.     (setq i (1+ i))
  12.   )
  13.   nil
  14. )
本来foreach 是遍历函数的,意味从头到尾,在这个例子中,func如果没有return函数,它的返回值总是nil,
正是因为有了return 函数,才使得函数在这点打断,返回了一个指定的值,使得函数得到了正确的返回值。然后因此引起的由主程序catch。
很好的思路,不过有点点遗憾的是 用到了vl-catch-all-apply,有可能会造成异常无法区分。
另外不知道楼主怎样对待 break,continue,和goto语句的呢?

点评

再次佩服。国人的骄傲。  发表于 2014-3-29 09:28
发表于 2011-1-15 17:07:06 | 显示全部楼层
我先占个坑,将来好LS,哈哈
发表于 2011-11-22 21:29:57 | 显示全部楼层
经典好贴!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-6 10:01 , Processed in 0.171087 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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