我正在使用库函数ConnectToTCPServer。当主机无法访问时,此功能会超时。在这种情况下,应用程序崩溃并出现以下错误: “非致命的运行时错误:”MyClient.c“,第93行,第15行,线程号0x000017F0:库函数错误(返回值== -11 [0xfffffff5])。超时错误”
Errorcode 11是一个超时错误,所以这可能在我的应用程序中经常发生 - 但应用程序崩溃 - 我想抓住这个错误,而不是让我的应用程序崩溃。
如何在Ansi C90中捕获此运行时错误?
编辑: 这是当前使用的Codesnippet:
ConnectToTCPServer(&srvHandle, srvPort, srvName, HPMClientCb, answer, timeout);
与
int HPMClientCb(UINT handle, int xType, int errCode, void *transData){
printf("This was never printed\n");
return errCode;
}
永远不会调用Callback函数。我的服务器未运行,因此ConnectToTCPServer将超时。我怀疑回调被调用 - 但它永远不会被调用。
编辑2:实际上没有调用回调函数,ConnectToTCPServer的返回值包含相同的错误信息。我认为这可能是ConnectToTCPServer引发此错误的错误。我只需要抓住它并将它装在C90中。任何想法?
编辑3:我测试了Callback函数,在我的服务器在线的罕见的occaision上实际调用了回调函数 - 这没有帮助,因为在发生错误时没有调用回调。
答案 0 :(得分:3)
查看NI文档,我看到了这一点:
“库错误断点 - 只要LabWindows / CVI库函数在运行时返回错误,您就可以设置一个选项来中断程序执行。”
我推测他们有一个调试选项可以使程序停止运行时错误,你需要在配置,编译时或运行时禁用它。
我的第一个猜测是配置值或编译标志,但这是我找到的唯一选项,这是一个运行时选项:
// If debugging is enabled, this function directs LabWindows/CVI not
// to display a run-time error dialog box when a National Instruments
// library function reports an error.
DisableBreakOnLibraryErrors();
说它是否有帮助。
答案 1 :(得分:2)
没有标准C中“捕捉”错误(或“例外”)的一般情况。这取决于您的图书馆以决定如何处理它。可能它的状态记录,然后简单地调用abort()。在Unix中,它表示可以处理的SIGABRT
,而不仅仅是exit()ed。或者他们的库可能只是记录,然后调用exit()。
您可以在strace
等实用程序下运行您的应用程序,以查看正在执行的系统调用 以及正在声明的信号。
如果你不能取得任何进展,我会与你的供应商合作。
答案 2 :(得分:1)
从文档中,您似乎应该在发生错误时调用clientCallbackFunction
。如果不这样做,您应该编辑您的问题以澄清这一点。
答案 3 :(得分:1)
我不确定我理解你。
我查看了库函数ConnectToTCPServer()
的文档。它返回一个int; 0表示成功,负数表示错误代码。
编辑:这是一个代码片段 目前使用:
ConnectToTCPServer(&srvHandle, srvPort, srvName, HPMClientCb, answer, timeout);
如果那是真正的当前用途,那么您似乎并没有试图判断ConnectToTCPServer()
是否成功。要做到这一点,你需要
int err_code;
...
err_code = ConnectToTCPServer(&srvHandle, srvPort, srvName, HPMClientCb, answer, timeout);
然后测试err_code。
documentation for ConnectToTCPServer()
表示除非来自TCP服务器的消息,否则不会调用您的回调函数。没有服务器,没有消息。在那种情况下,
ConnectToTCPServer()
应该返回一个负数。ConnectToTCPServer()
。我是否正确理解了文档?
答案 4 :(得分:0)
通常,您应该能够简单地检查返回值。您的应用程序退出的事实意味着某些东西已经捕获错误并断言(或类似的东西)。如果没有看到任何上下文(即代码演示如何使用此函数),则很难更精确。
答案 5 :(得分:0)
文档指出ConnectToTCPServer
将返回错误代码。只有在建立连接,断开连接或准备好读取数据时才会调用回调。
您收到的消息指出错误是非致命的,因此它不应该中止。如果您确定代码后来没有中止,那么它似乎确实像库中的错误一样。
我不熟悉CVI,但可能有一个(compile- / runtime-)选项即使在非致命错误上也会中止(出于调试目的)。如果您可以在最小的示例中重现这一点,则应report it to NI。