繁体   English   中英

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

[英]How can i catch a runtime error in ansi C90

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

错误代码 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的Returnvalue包含相同的错误信息。 我认为这可能是ConnectToTCPServer抛出此错误的错误。 我只需要抓住它并将它装在C90中。 有任何想法吗?

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

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

说它是否有帮助。

没有标准C中“捕捉”错误(或“例外”)的一般情况。这取决于你的图书馆决定如何处理它。 可能它的状态记录,然后简单地调用abort()。 在Unix中,它表示可以处理的SIGABRT ,而不仅仅是exit()ed。 或者他们的库可能只是记录,然后调用exit()。

你可以像下一个程序运行你的应用程序strace ,看看有什么正在执行系统调用和什么信号被断言。

如果你不能取得任何进展,我会与你的供应商合作。

从文档中,您似乎应该在发生错误时调用clientCallbackFunction 如果不这样做,您应该编辑您的问题以澄清这一点。

我不确定我理解你。

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

编辑:这是当前使用的Codesnippet:

ConnectToTCPServer(&srvHandle, srvPort, srvName, HPMClientCb, answer, timeout);

如果这真的是当前使用,你似乎并没有试图判断ConnectToTCPServer()是否成功。 要做到这一点,你需要

int err_code;
...
err_code = ConnectToTCPServer(&srvHandle, srvPort, srvName, HPMClientCb, answer, timeout);

然后测试err_code。

ConnectToTCPServer()文档意味着除非来自TCP服务器的消息,否则不会调用您的回调函数。 没有服务器,没有消息。 在这种情况下,

  1. ConnectToTCPServer()应返回一个负数。
  2. 您应该检查ConnectToTCPServer()的返回值。
  3. 在那里找到负数,你应该做一些明智的事情。

我是否正确理解了文档?

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM