找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1071|回复: 16

[求助] 怎么在调用函数的值为nil时,跳过错误

[复制链接]
发表于 2018-1-25 20:57:25 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 8142556 于 2018-1-25 21:01 编辑

怎么在调用函数的值为nil时,跳过错误不至于整个程序瘫痪。
autolisp有没有类似 try catch 这样的错误检测机制

比如我这个tiqu函数是nil值
  • (dcl-sendstring (tiqu '常用工具 1 3))



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

已领礼包: 20个

财富等级: 恭喜发财

发表于 2018-1-25 21:08:08 | 显示全部楼层
本帖最后由 marting 于 2018-1-25 21:11 编辑

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

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2018-1-25 21:09:54 | 显示全部楼层
本帖最后由 marting 于 2018-1-25 21:16 编辑

你试试把,你这个恐怕不行,因为你函数名为NIL了,LISP不允许的,vl-catch-all-apply 是捕获你函数执行过程中遇到的错误,让程序继续执行下去的,你这个函数都执行不了,它管不到的。

你自己程序判断啊,自己写的代码,还能让函数没有了?LISP程序的基本语法之一就是左括号后面必须是函数名,你连这个都违背了,就谈不上别的了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-25 21:15:53 | 显示全部楼层

我是用循环来调用表比如表1有50个字符串
       表2只有30个字符串
       表3.。。。

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

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2018-1-25 21:18:41 | 显示全部楼层

不管表数据多长,这些都是函数的参数,不会是导致函数名为NIL的原因,怎么会导致函数没定义呢?
你可以捕获参数的错误,但前提是函数能正确执行。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2018-1-25 21:20:27 | 显示全部楼层

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

使用道具 举报

 楼主| 发表于 2018-1-25 21:24:59 | 显示全部楼层

主要是不想把程序写死了,以后可以在表里添加或删除内容,程序也能读取到,不用再打开程序来修改代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-25 21:27:37 | 显示全部楼层
  1. (findfile "data.lsp")
  2. (vl-load-all "data.lsp")
  3. (dcl_Project_Load "wanfeng.odcl")
  4. (dcl_Form_Show wanfeng_WF)
  5. (dcl_Project_Unload "wanfeng")
  6. ;----------------------------------------------------------------------------------
  7. (defun tiqu (Bxiangmu Bhangshu Bgeshu / **wfdata** wfdata1 wfdata2 wfdata3)
  8. (setq **wfdata** (ea_mainmenu_datastru))
  9. (setq wfdata1  (assoc Bxiangmu **wfdata**))
  10. (setq wfdata2  (nth Bhangshu wfdata1))
  11. (setq wfdata3  (nth Bgeshu wfdata2))
  12. )
  13. ;----------------------------------------------------------------------------------
  14. (defun Dtxt ( / wftxt optxt dqtxt)
  15. (setq wftxt (findfile "wanfeng.txt"));查找文件wanfeng.txt
  16. (setq optxt (open wftxt "r")) ;;打开并读取文件
  17. (setq dqtxt (read-line optxt));;读取第一个内容
  18. (setq txt dqtxt)
  19. (close optxt)
  20. )
  21. ;----------------------------------------------------------------------------------
  22. (defun c:wanfeng_WF_晚枫工具_cybtn1_OnClicked (/)
  23. (Dtxt)
  24. (cond ((= txt "01") (dcl-sendstring (tiqu '常用工具 1 3)))
  25.             ((= txt "02") (dcl-sendstring (tiqu '图形系统 1 3)))
  26.                         ((= txt "03") (dcl-sendstring (tiqu '平面门窗 1 3)))
  27.                         ((= txt "04") (dcl-sendstring (tiqu '平面功能 1 3)))
  28.                         ((= txt "05") (dcl-sendstring (tiqu '立面功能 1 3)))
  29.                         ((= txt "06") (dcl-sendstring (tiqu '剖面功能 1 3)))
  30.                         ((= txt "07") (dcl-sendstring (tiqu '常用符号 1 3)))
  31.                         ((= txt "08") (dcl-sendstring (tiqu '文字工具 1 3)))
  32.                         ((= txt "09") (dcl-sendstring (tiqu '尺寸标注 1 3)))
  33.                         ((= txt "10") (dcl-sendstring (tiqu '特殊工具 1 3)))
  34.                         ((= txt "11") (dcl-sendstring (tiqu '填充图案 1 3)))
  35.                         ((= txt "12") (dcl-sendstring (tiqu '图块属性 1 3)))
  36.                         ((= txt "13") (dcl-sendstring (tiqu '线条工具 1 3)))
  37.                         ((= txt "14") (dcl-sendstring (tiqu '编辑修改 1 3)))
  38.                         ((= txt "15") (dcl-sendstring (tiqu '群组布局 1 3)))
  39.                         ((= txt "16") (dcl-sendstring (tiqu '图层工具 1 3)))
  40.                         ((= txt "17") (dcl-sendstring (tiqu '统计工具 1 3)))
  41.                         ((= txt "18") (dcl-sendstring (tiqu '其他工具 1 3)))
  42. )
  43. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2018-1-25 21:30:56 | 显示全部楼层

你这些都不是能让函数名为NIL的原因啊,你是怎么让函数名为NIL的? 你的代码,不在一个LISP里面的,你要有LOAD语句,加载需要的其他LISP啊。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-25 21:37:22 | 显示全部楼层

微信图片_20180125213239.png
我的表是这样的,我一共有50个按钮,要用50个按钮分别调用各个分类不同的命令
代码后面还没开始写,先写了一个按钮

比我到后面我提取到50行的时候,没有这么多行的分类是nil值了,
但是我不提取到50行的话,以后再后面加内容又要修改源代码,很麻烦
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-25 21:39:08 | 显示全部楼层
写个界面添加一些自己使用习惯的命令
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1882个

财富等级: 堆金积玉

发表于 2018-1-25 21:42:25 | 显示全部楼层
本帖最后由 aimisiyou 于 2018-1-25 22:02 编辑

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

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2018-1-25 21:42:54 | 显示全部楼层
本帖最后由 marting 于 2018-1-25 21:44 编辑

你把这些菜单组织成关联表,表可以保存到文件,以后你不用改程序,直接改表就可以增加和删除项了

(setq lst '( ("01" "常用工具" "1" "3")("02" "常用工具" "1" "3")("03" "常用工具" "1" "3")("04" "常用工具" "1" "3") ...)
程序也不用管是50个,还是100个了,表有多少内容,循环就做多少个。

以后你程序用循环就行了

  1. (mapcar        '(lambda (x)
  2.            (setq no (car x))
  3.            (setq name (cadr x))
  4.            (setq a (nth 2 x)
  5.                  b (nth 3 x)
  6.            )
  7.            (dcl-sendstring (tiqu (eval (read name)) a b))
  8.          )
  9.         lst
  10. )

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

使用道具 举报

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-1-25 22:01:24 | 显示全部楼层

按MATRING说的做,数据和代码分离, 数据你想怎么保存就怎么保存,保存到TXT,可以读入写到关联表里面。以后修改数据,不用修改代码。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 04:43 , Processed in 0.447373 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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