3

ライブラリ関数ConnectToTCPServerを使用しています。この関数は、ホストに到達できない場合にタイムアウトします。その場合、アプリケーションは次のエラーでクラッシュします: "NON-FATAL RUN-TIME ERROR:" MyClient.c "、line 93、col 15、thread id 0x000017F0:Library function error(return value == -11 [0xfffffff5]) 。タイムアウトエラー」

エラーコード11はタイムアウトエラーであるため、これは私のアプリケーションで非常に頻繁に発生する可能性がありますが、アプリケーションがクラッシュします。アプリケーションをクラッシュさせるのではなく、このエラーをキャッチしたいと思います。

Ansi C90でこのランタイムエラーをキャッチするにはどうすればよいですか?

編集:これが現在の使用のコードスニペットです:

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の戻り値に、同じエラー情報が含まれています。ConnectToTCPServerがこのエラーをスローするのはバグかもしれないと思います。私はそれをキャッチしてC90でビンに入れる必要があります。何か案は?

編集3:コールバック関数をテストしました。サーバーがオンラインであるというまれなケースで、コールバック関数が実際に呼び出されます。エラーが発生したときにコールバックが呼び出されないため、これは役に立ちません。

4

6 に答える 6

3

Looking in NI documentation, I see this:
"Library error breakpoints -- You can set an option to break program execution whenever a LabWindows/CVI library function returns an error during run time. "

I would speculate they have a debug option to cause the program to stop on run-time errors, which you need to disable in configuration, in compile time or in run-time.

My first guess would have been configuration value or compilation flag, but this is the only option I found, which is a run-time option:
// 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();

Say if it helped.

于 2011-02-03T20:53:57.707 に答える
2

標準Cではエラー(または「例外」)を「キャッチ」する一般的なケースなどはありません。それをどうするかを決めるのはライブラリ次第です。おそらく、その状態をログに記録してから、単にabort()を呼び出します。Unixでは、SIGABRTexit()だけでなく、処理できるシグナルです。または、ライブラリがログに記録してからexit()を呼び出しているだけの場合もあります。

straceどのシステムコール実行され、どのシグナルがアサートされているかを確認するようなユーティリティの下でアプリケーションを実行できます。

それ以外の方法で前進できない場合は、ベンダーと協力します。

于 2011-01-27T23:27:21.450 に答える
1

clientCallbackFunctionドキュメントから、エラーが発生したときにあなたに電話をかける必要があるようです。そうでない場合は、質問を編集して明確にする必要があります。

于 2011-01-21T11:13:43.730 に答える
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をテストします。

ドキュメントはConnectToTCPServer()、TCPサーバーからのメッセージがない限り、コールバック関数が呼び出されないことを示しています。サーバーもメッセージもありません。その場合、

  1. ConnectToTCPServer()負の数を返す必要があります。
  2. の戻り値を確認する必要がありConnectToTCPServer()ます。
  3. そこで負の数を見つけたら、賢明なことをする必要があります。

ドキュメントを正しく理解しましたか?

于 2011-01-30T00:22:09.170 に答える
0

通常は、戻り値を簡単に確認できるはずです。アプリケーションが終了するという事実は、何かがすでにエラーをキャッチしてアサートしていることを意味します(または同様のもの)。コンテキスト(つまり、この関数の使用方法を示すコード)がなければ、これ以上正確にすることは困難です。

于 2011-01-21T10:45:15.870 に答える
0

ドキュメントにはConnectToTCPServer、エラーコードを返すと記載されています。コールバックは、接続が確立された場合、切断された場合、または読み取る準備ができているデータがある場合にのみ呼び出されます。

表示されるメッセージには、エラーが致命的ではないことが示されているため、中止しないでください。コードが後で中止されないことが確実な場合は、実際にライブラリのバグのようです。

私はCVIに精通していませんが、致命的でないエラー(デバッグ目的)でも中止する(compile- / runtime-)オプションがあるかもしれません。最小限の例でこれを再現できる場合は、NIに報告する必要があります。

于 2011-02-03T10:28:38.020 に答える