我有这个功能:
Tcl_Obj* cFuncTcl (Tcl_Interp* interp, Tcl_Obj* obj) {
Tcl_Obj *listObj = Tcl_NewListObj (0,NULL);
const char* var = Tcl_GetString(obj);
if (strcmp(var, "foo")) {
fprintf(stderr, "error\n");
exit(EXIT_FAILURE);
} else {
// Do something
}
return listObj;
}
当我的函数返回一个整数来报告错误时,我使用
return Tcl_ERROR;
,但这里我的函数返回一个 obj
。
我的问题:是否有一个 API C Tcl 相当于 exit(EXIT_FAILURE)?
如果您正在谈论 Tcl 命令实现,则
return TCL_ERROR;
表示出现问题(如果成功,则 TCL_OK
表示)。在 Tcl 脚本级别,这会成为抛出的错误(在解释器结果中带有错误消息),您可以使用 catch
或 try
进行处理。由最终调用 Tcl_Eval()
或 Tcl_EvalFile()
的代码来决定如果错误冒出那么远该怎么办;在 tclsh
中,打印了错误堆栈展开跟踪并且该过程存在......但这实际上只是最简单的选项。
在整个流程级别,在 C 中使用
Tcl_Exit(EXIT_FAILURE);
。或者在脚本中使用 exit 1
。执行它上面所说的操作(在运行关键退出处理程序以执行诸如刷新 I/O 缓冲区之类的操作之后)。
我使用 return Tcl_ERROR;当我的函数返回一个整数来报告错误时,
通过其返回值报告错误与终止进程的
exit()
不同。不需要 TCL API 来终止进程,这与 exit()
有什么不同?
如果您想从该函数返回并带有错误指示而不是中止,则只需返回 NULL - 返回值是 pointer 或对象,而不是对象本身,因此返回 NULL 是指示失败的惯用方式。
Tcl_Obj* cFuncTcl (Tcl_Interp* interp, Tcl_Obj* obj)
{
Tcl_Obj *listObj = Tcl_NewListObj (0,NULL);
const char* var = Tcl_GetString(obj);
if (strcmp(var, "foo"))
{
fprintf(stderr, "error\n");
return NULL ;
}
else
{
// Do something
}
return listObj;
}
是否有相当于 exit(EXIT_FAILURE) 的 API C Tcl?
Tcl_Exit()
,但尚不清楚在这种情况下这是否是您实际需要的。您似乎将进程终止与返回错误状态的函数混为一谈。尽管如此:
Tcl_Obj* cFuncTcl (Tcl_Interp* interp, Tcl_Obj* obj)
{
Tcl_Obj *listObj = Tcl_NewListObj (0,NULL);
const char* var = Tcl_GetString(obj);
if (strcmp(var, "foo"))
{
fprintf(stderr, "error\n");
Tcl_Exit( Tcl_ERROR ) ;
}
else
{
// Do something
}
return listObj;
}