2011-01-21 66 views
3

我正在使用函数库函数ConnectToTCPServer。当主机不可访问时,此功能超时。在这种情况下,应用程序崩溃并出现以下错误: “非致命的运行时错误:”MyClient.c“,第93行,第15行,线程ID 0x000017F0:库函数错误(返回值== -11 [0xfffffff5] )。超时错误“我如何在ansi C90中捕获运行时错误

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; 
} 

的callbackFunction参数永远不会被调用。我的服务器没有运行,所以ConnectToTCPServer会超时。我会怀疑这个回调是被调用的 - 但它永远不会被调用。

编辑2:实际上不调用回调函数,ConnectToTCPServer的Returnvalue包含相同的错误信息。我认为这可能是一个错误ConnectToTCPServer引发此错误。我只需要抓住它并将其存入C90。有任何想法吗?

编辑3:我测试了回调函数,在我的服务器在线的罕见occaision实际上调用回调函数 - 这并没有帮助,因为当发生错误时不会调用回调函数。

回答

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();

说,如果它帮助。

0

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

+0

我提供了一个简约的例子 - 我相信这个错误在图书馆里被抓住,然后扔进我的应用程序,我不知道如何处理它。 – Johannes 2011-01-21 12:31:42

1

从文档看来,当发生错误时,您应该打电话给您的clientCallbackFunction。如果你不这样做,你应该编辑你的问题来澄清。

+0

我的clientCallbackFunction实际上从来没有被调用过。 – Johannes 2011-01-21 12:32:16

+0

我完全没有从文档中得知。在我看来,只有在服务器有TCP_DISCONNECT或TCP_DATAREADY事务时才应该调用回调函数。 – 2011-02-14 10:45:25

2

Theres没有像在标准C中“捕捉”错误(或“异常”)的一般情况那样的事情。这取决于您的库决定如何处理它。可能会记录它的状态,然后简单地调用abort()。在Unix中,这表明SIGABRT可以处理,而不仅仅是退出()编辑。或者他们的库可能只是正在记录,然后调用exit()。

您可以在strace等实用程序下运行您的应用程序,以查看正在执行的系统调用以及哪些信号被声明。

如果您无法取得任何进展,我会与您的供应商合作。

1

我不知道我理解你。

我查看了库函数ConnectToTCPServer()的文档。它返回一个int; 0表示成功,负数表示错误代码。

EDIT: Here is a Codesnippet of the current use:

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. 在那里找到一个负数,你应该做一些明智的事情。

我是否正确理解文档?

+0

我简化了一点。通过将返回值存储在变量中,情况不会改变。 – Johannes 2011-02-14 10:10:34

+0

您的编辑3表示您希望在发生错误时调用回调函数。从阅读文档,我不会指望。我希望你的回调只有在TCP服务器有TCP_DISCONNECT或TCP_DATAREADY事务时才会被调用。我不会认为错误是任何一种交易类型。 – 2011-02-14 10:41:38

0

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

您收到的消息指出错误是非致命的,因此它不应该中止。如果你确定代码不会在以后中止,它看起来确实像是库中的一个错误。

我对CVI并不熟悉,但可能有(编译/运行时)选项即使在非致命错误(用于调试目的)时也会中止。如果你能在最小的例子中重现这一点,你应该report it to NI