明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1952|回复: 6

[求助]大家帮我看看这样的出错处理应该怎么样写

[复制链接]
发表于 2010-8-12 16:05:00 | 显示全部楼层 |阅读模式

;|
大家帮我看看这样的出错处理应该怎么样写

请不必关注111_temp的具体内容
因为它只是个范例而不是问题的重点


当程序出错以后
系统会调用出错处理函数
程序里重定义了*error*
希望出错以后继续调用111_temp
如果再出错就再调用
(实际程序里有跳过出错环节的处理)
一直到程序正常结束

但是下面的出错语句不能达成愿望
具体表现在
第一次出错时----程序调用出错处理,即调用111_temp
再一次出错时----程序报错退出
大家帮我看看到底是哪里出了问题
1。是这个想法本身不可能实现
2。还是出错语句写得有问题
3。或者出错语句放置的位置有问题


|;

(defun 111_err()
 (setvar "cmdecho" 0)
 (setq olderr *error* )
(princ)
)
(defun *error*(msg)
 (setq *error* olderr)
 (111_temp)
 (111_no_err)
(princ)
)
(defun 111_no_err()
 (setq *error* olderr)
(princ)
)

(defun 111_temp()
 (setq p1 (getpoint "\n我要一个点"))
 (setq p2 (getpoint p1 "\n我还要"))
 (command "line" "non" p1 "non" p2 "")
 (setq p3 (getpoint p2 "\n我就是要"))
 (command "line" "non" p2 "non" p3 "")
)

(defun c:111() (load "111.lsp")
 (111_err)
 (111_temp)
 (111_no_err)
(princ)
)

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2010-8-12 17:38:00 | 显示全部楼层

請問你這樣寫有何用處?

如果讓錯誤處理會持續執行某些動作,

這...好像可以寫成病毒唷!!!

 楼主| 发表于 2010-8-12 21:09:00 | 显示全部楼层

写了一个多文件处理的程序

但少部分dwg具有某种我不了解的特性

程序处理这种文件的时候就会退出

因为这类dwg不在我需要处理的范围之类

又无法在形成dwg列表的时候将它剔除

所以写了跳过它的程序段

想再利用出错处理来“继续”我的程序

 楼主| 发表于 2010-8-12 22:47:00 | 显示全部楼层

其实有一种方法可以做到出错后“继续”流程

很简单

就是在*error*子函数中

创建一个SCR文件并执行它

例如本程序中

(defun *error*(msg)
  (setq *error* olderr)
  (setq @x_scr (open "c:\\QGY_temp\\@x_scr.scr" "w"))
  (write-line "111" @x_scr)
  (close @x_scr)
  (command "script" "c:\\QGY_temp\\@x_scr.scr")
 )

现在只是想弄明白

单纯依靠系统的出错处理功能

能否实现程序的循环调用

 楼主| 发表于 2010-8-12 23:34:00 | 显示全部楼层

大家看看下面的分析对不对

 

 

开始运行111时出错

CAD系统不再处于(C:111)的控制范围内

而是处于*error*的控制范围内

此时不接受再次定义*error*子函数

也就是在一个子函数里不能重定义该函数并执行它

 

 

而使用批处理的方法

在*error*子函数执行到(command "script")这个语句时

虽然批处理是由*error*子函数调用的

但是批处理的特点是其后的LISP语句一概忽略

也就是系统不但跳出了(C:111)也脱离了*error*的控制

于是*error*可以再次被重定义

也因此(C:111)得到了循环调用

 

 

非专业人士可能一些用词不准确

意思大概就是这样了

如果这个理论是对的

那么采用批处理就是唯一可行的解决之道了

????

 楼主| 发表于 2010-8-12 23:52:00 | 显示全部楼层

关于“在一个函数里不能重定义该函数并执行它”这一句

 

看下面两个实验程序段

(defun xxx()
 (princ "不")
 (defun xxx()
  (princ "要")
 )
 (xxx)
 (princ "停")
(princ)
)

 

(defun xxx()
 (princ "不")
 (defun xxx()
  (princ "要")

  (xxx)
 )
 (xxx)
 (princ "停")
(princ)
)

 

执行(xxx)的结果是不一样的

 楼主| 发表于 2010-8-13 00:02:00 | 显示全部楼层

第二个(xxx)运行的结果是

不断的开辟内存创建xxx子函数

最终导致堆栈溢出

这似乎不能证明那句话的有效性

 

头疼

想不明白了

等高手指点迷津吧

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

本版积分规则

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

GMT+8, 2024-10-2 08:33 , Processed in 0.182540 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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