Обработайте ошибки обработки функции

Чтобы обработать ошибки, которые происходят при обработке функций MATLAB®:

  1. Оцените состояние, возвращенное функцией feval(), чтобы определить, была ли функция успешно обработана.

  2. Получите информацию ошибки с помощью функции getLastErrorInfo().

  3. Опросите поле type деталей ошибки, чтобы определить тип ошибки.

  4. Обработайте информацию об ошибке соответственно.

  5. Очистка ресурсы, используемые информацией об ошибке с помощью функции destroyLastErrorInfo().

Определите, произошла ли Ошибка

Функция feval() возвращает значение типа mpsStatus, который имеет значение, произошла ли ошибка, в то время как функция обрабатывалась. Состояние может иметь одно из двух значений:

  • MPS_OK указывает, что функция обработала успешно.

  • MPS_FAILURE указывает, что ошибка произошла.

Например, чтобы проверять, произошла ли ошибка при оценке функции MATLAB, используйте если затем оператор.

status = mpsruntime->feval(context,funUrl,outArgs,outVal,inArgs,inVal);
if (status==MPS_OK)
{
  ...
}
else
{
  ...
}

Получите ошибочную информацию

Если вызов функции feval() возвращает значение MPS_FAILURE, можно получить детали ошибки путем вызывания функции getLastErrorInfo(). Это возвращает структуру mpsErrorInfo, которая содержит эти поля:

  • сообщение Общая информация строки, содержащей об ошибке

  • ввод Символ, идентифицирующий тип ошибки. Идентификатор типа используется, чтобы выбрать правильный тип данных для подробной информации об ошибке.

  • детали Структура, содержащая детали, такие как стек MATLAB, об ошибке и ее первопричине

Получить ошибочную информацию и распечатать основное сообщение об ошибке:

mpsErrorInfo error;
mpsruntime->getLastErrorInfo(context, &error);
std::cout << "Error: " << error.message << std::endl;

Определите тип ошибки

Прежде чем можно будет обработать подробную информацию об ошибке, необходимо определить, какая ошибка произошла. Это сделано путем опроса поля type структуры mpsErrorInfo. Это может иметь одно из трех значений:

  • MPS_HTTP_ERROR_INFO — Не200 ошибок HTTP произошли, и детали хранятся в структуре mpsErrorInfoHTTP

  • MPS_MATLAB_ERROR_INFO — Ошибка MATLAB произошла, и детали хранятся в структуре mpsErrorInfoMATLAB

  • MPS_GENERIC_ERROR_INFO — Неопределенная ошибка произошла, и детали хранятся в структуре mpsErrorInfoGeneric

Если вы определяете тип ошибки, можно обработать подробную информацию. Определить ошибочный тип с помощью оператора switch:

mpsErrorInfo error;
mpsruntime->getLastErrorInfo(context, &error);
switch(error.type)
{
case MPS_HTTP_ERROR_INFO:
  ...
case MPS_MATLAB_ERROR_INFO:
  ...
case MPS_MATLAB_ERROR_INFO:
  ...
}

Процесс ошибки HTTP

Детали HTTP ошибки хранятся в структуре mpsErrorInfoHTTP. Эта структура имеет два поля:

  • responseCode — Код ошибки HTTP

  • responseMessage — Строка, содержащая сообщение, возвращенное с ошибкой

Например, при попытке получить доступ к функции с помощью недопустимого URL, клиент может возвратить структуру mpsErrorInfoHTTP со следующими значениями:

  • responseCode — 404

  • responseMessage — Не найденный

Процесс ошибки MATLAB

Если ошибка происходит, в то время как MATLAB Runtime выполняет функцию, клиент возвращает структуру mpsErrorInfoMATLAB. Эта структура имеет следующие поля:

  • сообщение Сообщение об ошибке возвращено MATLAB Runtime

  • identifier — Ошибочный ID MATLAB

  • Стек matlabStack — MATLAB Runtime

  • matlabStackDepth — Количество записей в стеке MATLAB Runtime

Записи в стеке MATLAB Runtime имеют следующие поля:

  • file — Имя файла MATLAB, который вызвал ошибку

  • функция Имя функции MATLAB, которая вызвала ошибку

  • строка Номер строки в файле MATLAB, который вызвал ошибку

Распечатать содержимое ошибки MATLAB:

mpsErrorInfo error;
mpsruntime->getLastErrorInfo(context, &error);
switch(error.type)
{
case MPS_HTTP_ERROR_INFO:
  ...
case MPS_MATLAB_ERROR_INFO:
  std::cout << "MATLAB: " << error.details.matlab.identifier
    << std::endl;
  std::cout << error.details.matlab.message << std::endl;
  for (int i=0; i < error.details.matlab.matlabStackDepth; i++)
  {
    std::cout << "in " <<  error.details.matlab.matlabStack[i].file 
     << " at " << error.details.matlab.matlabStack[i].function 
     << " line number " << error.details.matlab.matlabStack[i].line
     << std::endl;
  }
case MPS_MATLAB_ERROR_INFO:
  ...
}

Процесс типичные ошибки

Если ошибка кроме не200 ответов HTTP или исключения MATLAB Runtime происходит, клиент возвращает структуру mpsErrorInfoGeneric, содержащую поле genericErrorMessage.

Очистите информацию об ошибке

Информация об ошибке, созданная клиентским временем выполнения MATLAB Production Server™, непрозрачна. Если вы обработали ошибку, очистите ресурсы, используемые ошибкой функция destroyLastErrorInfo() mpsClientRuntime. Это берет указатель на информацию об ошибке, возвращенную в getLastErrorInfo().

mpsClientRuntime* mpsruntime = mpsInitialize();
mpsErrorInfo error;
mpsruntime->getLastErrorInfo(context, &error);
...
mpsruntime->destroyLastErrorInfo(&error);