Чтобы обработать ошибки, которые происходят при обработке функций MATLAB®:
Оцените состояние, возвращенное функцией feval()
, чтобы определить, была ли функция успешно обработана.
Получите информацию ошибки с помощью функции getLastErrorInfo()
.
Опросите поле type
деталей ошибки, чтобы определить тип ошибки.
Обработайте информацию об ошибке соответственно.
Очистка ресурсы, используемые информацией об ошибке с помощью функции 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 ошибки хранятся в структуре mpsErrorInfoHTTP
. Эта структура имеет два поля:
responseCode
— Код ошибки HTTP
responseMessage
— Строка, содержащая сообщение, возвращенное с ошибкой
Например, при попытке получить доступ к функции с помощью недопустимого URL, клиент может возвратить структуру mpsErrorInfoHTTP
со следующими значениями:
responseCode
— 404
responseMessage
— Не найденный
Если ошибка происходит, в то время как 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);