如何在ansi C90中捕获运行时错误

时间:2011-01-21 09:15:09

标签: c tcp c89 cvi

我正在使用库函数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上实际调用了回调函数 - 这没有帮助,因为在发生错误时没有调用回调。

6 个答案:

答案 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服务器的消息,否则不会调用您的回调函数。没有服务器,没有消息。在那种情况下,

  1. ConnectToTCPServer()应该返回一个负数。
  2. 您应该检查ConnectToTCPServer()
  3. 的返回值
  4. 在那里找到负数,你应该做点明智的事。
  5. 我是否正确理解了文档?

答案 4 :(得分:0)

通常,您应该能够简单地检查返回值。您的应用程序退出的事实意味着某些东西已经捕获错误并断言(或类似的东西)。如果没有看到任何上下文(即代码演示如何使用此函数),则很难更精确。

答案 5 :(得分:0)

文档指出ConnectToTCPServer将返回错误代码。只有在建立连接,断开连接或准备好读取数据时才会调用回调。

您收到的消息指出错误是非致命的,因此它不应该中止。如果您确定代码后来没有中止,那么它似乎确实像库中的错误一样。

我不熟悉CVI,但可能有一个(compile- / runtime-)选项即使在非致命错误上也会中止(出于调试目的)。如果您可以在最小的示例中重现这一点,则应report it to NI