2011-01-21 2 views
3

Я пользуюсь библиотекой Функция ConnectToTCPServer. Эта функция отключается, когда хост недоступен. В этом случае приложение выходит из строя со следующей ошибкой: «ОШИБКА НЕПРЕРЫВНОГО ОШИБКА:« MyClient.c », строка 93, столбец 15, идентификатор потока 0x000017F0: ошибка функции библиотеки (возвращаемое значение == -11 [0xfffffff5]). Ошибка тайм-аута «Как я могу поймать ошибку времени выполнения в ansi C90

Errorcode 11 - ошибка таймаута, так что это может произойти довольно часто в моем приложении - однако приложение сбой - я хотел бы поймать эту ошибку, а не сбой приложения.

Как я могу поймать эту ошибку времени выполнения в Ansi C90?

EDIT: Вот 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 истечет. Я бы заподозрил, что вызван обратный вызов, но он никогда не называется.

EDIT 2: Функция обратного вызова фактически не вызывается, возвращаемое значение ConnectToTCPServer содержит ту же информацию об ошибке. Я думаю, это может быть ошибка, которая вызывает ошибку ConnectToTCPServer. Мне просто нужно поймать его и выложить на C90. Есть идеи?

РЕДАКТИРОВАТЬ 3: Я проверил функцию обратного вызова, в редких случаях, когда мой сервер подключен к функции обратного вызова, на самом деле это вызвано - это не помогает, хотя из-за того, что обратный вызов не вызывается при возникновении ошибки.

ответ

3

Глядя в NI документации, я вижу это:
«Библиотека точек останова ошибок - Вы можете установить опцию разбить выполнение программы всякий раз, когда функция библиотеки LabWindows/CVI возвращает ошибку во время выполнения.»

I предположили бы, что у них есть опция отладки, чтобы заставить программу останавливаться на ошибках во время выполнения, которые вам нужно отключить в конфигурации, во время компиляции или во время выполнения.

Моя первая догадка была бы значение конфигурации или флаг компиляции, но это единственный вариант, я нашел, что это вариант во время выполнения:
// 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

Я был болен и в настоящее время не могу проверить это - я смогу пройти тест через две недели. – Johannes

+1

Спасибо - это помогло ... извините, я не сразу ответил. Я был заперт в комнате в течение 8 недель ... по требованию клиентов. – Johannes

0

Обычно вы должны просто проверить возвращаемое значение. Тот факт, что ваше приложение выходит, подразумевает, что что-то уже улавливает ошибку и утверждает (или что-то подобное). Не видя контекста (например, кода, демонстрирующего, как вы используете эту функцию), трудно быть более точным.

+0

Я представил минималистский пример - я считаю, что ошибка зашифрована в библиотеке, а затем брошена в мое приложение, где я не знаю, как с этим бороться. – Johannes

1

Из документации, похоже, вы должны позвонить по телефону clientCallbackFunction при возникновении ошибки. Если вы этого не сделаете, вы должны изменить свой вопрос, чтобы уточнить это.

+0

My clientCallbackFunction на самом деле никогда не вызывается. – Johannes

+0

Я не получил этого от документации. Кажется, функция обратного вызова должна вызываться только тогда, когда на сервере выполняется транзакция TCP_DISCONNECT или TCP_DATAREADY. –

2

Нет такой вещи, как общий случай «ловить» ошибку (или «исключение») в стандартном C. Это зависит от вашей библиотеки, чтобы решить, что с ней делать. Вероятно, он регистрирует свое состояние, а затем просто вызывает abort(). В Unix, который сигнализирует SIGABRT, который можно обрабатывать, а не только exit() ed. Или их библиотека может просто регистрироваться, а затем вызывать 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

Я немного упростил. Ситуация не изменяется, сохраняя значение returnvalue в переменной. – Johannes

+0

Ваш Редактор 3 говорит, что вы ожидаете, что ваша функция обратного вызова будет вызвана при возникновении ошибки. От чтения документов я бы этого не ожидал. Я ожидаю, что ваш callback будет вызван только при транзакции TCP_DISCONNECT или TCP_DATAREADY с сервера TCP. Я бы не считал ошибку одним из этих типов транзакций. –

0

В документации указано, что ConnectToTCPServer вернет код ошибки. Обратный вызов вызывается только в том случае, если соединение установлено, отключено или когда есть готовые данные для чтения.

Сообщение, которое вы получаете, указывает на то, что ошибка не является FATAL, поэтому она не должна прерываться. Если вы уверены, что код не прерывается позже, он кажется действительно ошибкой в ​​библиотеке.

Я не знаком с CVI, но может быть опция (compile-/runtime-) для отмены даже при нефатальных ошибках (для целей отладки). Если вы можете воспроизвести это в минимальном примере, вы должны report it to NI.

+0

Я связался с NI - они в настоящее время изучают его. – Johannes

+0

Из чтения других комментариев мне кажется, что вы не понимаете, как работать с ошибками. Вам нужно сохранить возвращаемое значение и проверить его на код ошибки. Только если функция никогда не возвращается, это ошибка библиотеки. Для библиотеки полностью законно возвращать код ошибки и не вызывать обратный вызов. – chris

Смежные вопросы