主要内容

本页采用了机器翻译。点击此处可查看英文原文。

处理函数处理错误

处理 MATLAB® 函数时发生的错误:

  1. 评估 feval() 函数返回的状态以确定该函数是否已成功处理。

  2. 使用 getLastErrorInfo() 函数获取错误信息。

  3. 询问错误详细信息的 type 字段以确定错误的类型。

  4. 适当处理错误信息。

  5. 使用 destroyLastErrorInfo() 函数清理错误信息所使用的资源。

确定是否发生错误

feval() 函数返回 mpsStatus 类型的值,表示在处理该函数时是否发生错误。状态可以具有以下两个值之一:

  • MPS_OK 表示该函数处理成功。

  • MPS_FAILURE 表示发生了错误。

例如,要检查在评估 MATLAB 函数时是否发生错误,请使用 if-then 语句。

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

获取错误信息

如果调用 feval() 函数返回值为 MPS_FAILURE,则可以通过调用 getLastErrorInfo() 函数获取错误的详细信息。它返回一个包含以下字段的 mpsErrorInfo 结构体:

  • message - 包含有关错误的一般信息的字符串

  • type - 标识错误类型的字符。类型标识符用于为详细的错误信息选择正确的数据类型。

  • details - 包含有关错误及其根本原因的详细信息(例如 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 结构体。该结构体具有以下字段:

  • message - MATLAB Runtime 返回的错误消息

  • identifier - MATLAB 错误 ID

  • matlabStack - MATLAB Runtime 堆栈

  • matlabStackDepth - MATLAB Runtime 堆栈中的条目数

MATLAB Runtime 堆栈中的条目具有以下字段:

  • file - 导致错误的 MATLAB 文件的名称

  • function - 导致错误的 MATLAB 函数的名称

  • line - 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™ 客户端运行时创建的错误信息是不透明的。处理错误后,使用 mpsClientRuntime destroyLastErrorInfo() 函数清理错误所使用的资源。它需要一个指向从 getLastErrorInfo() 返回的错误信息的指针。

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