2011-10-13 44 views
1

任务:嵌入ECL口齿不清在我的项目,设置错误处理和详细的错误报告(其中发生了,那种错误等)嵌入式ECL口齿不清错误处理

我试图做这样的方式:

cl_def_c_function_va(
    c_string_to_object("SYSTEM:UNIVERSAL-ERROR-HANDLER"), 
    LispErrorHandler); 

ECL对其嵌入式API没有文件和错误处理没有文档...

您能否提供如何实现?

+0

请,任何人! –

回答

5

没有全局错误处理程序,因为这不是Common Lisp的理念。如果您想要处理错误,请使用lisp方式。

1)创建一个使用HANDLER-CASE或HANDLER-BIND来设置适当的错误处理程序和捕获错误周围的形式要被评估的功能。喜欢的东西

(defun定义MY-EVAL(FORM) (HANDLER-CASE(EVAL FORM) (ERROR(C)...) (MY-ERROR(C)...) ...) )

该函数可以在C代码被定义和调用。

2)请使用ECL创建捕获所有错误的功能。最重要的是si_safe_eval(表单,环境,error_value)。它评估环境中的lisp FORM(通常为Cnil)并返回其输出或ERROR_VALUE(如果出现错误)。

使用一种或另一种技术的一些例子: http://thread.gmane.org/gmane.lisp.ecl.general/5365(2日消息) http://thread.gmane.org/gmane.lisp.ecl.general/8526/focus=8529

+0

非常感谢,Juanjo!我使用了第一个解决方案... –

+0

...但尝试评估'(defun SYSTEM:UNIVERSAL-ERROR-HANDLER(a1 a2 a3)t)'然后'(qwertyuiop)',错误消息暗示该函数存在1)并且可以被编码/改变(2)。 你确定,我们不能使用它? 这不是'乏味',但'科学'的兴趣,你可能不会回答,如果你不想要;)再次感谢! –

+1

系统:请通用错误处理程序不要混淆。如果您想更改错误处理程序,请使用Common Lisp标准。这个函数只存在于内部目的中,你试图猜测它不能被覆盖。它由Common Lisp的SIGNAL在内部使用,不会暴露给用户。拦截它并不会使错误消失 - 在ECL中无处不在的错误处理。如果您覆盖该函数然后评估(SIN“Hello”)会发生什么? – Juanjo