处理函数处理错误
处理 MATLAB® 函数时发生的错误:
评估
feval()函数返回的状态以确定该函数是否已成功处理。使用
getLastErrorInfo()函数获取错误信息。询问错误详细信息的
type字段以确定错误的类型。适当处理错误信息。
使用
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- 404responseMessage- 未找到
进程 MATLAB 错误
如果在 MATLAB Runtime 评估函数时发生错误,客户端将返回 mpsErrorInfoMATLAB 结构体。该结构体具有以下字段:
message- MATLAB Runtime 返回的错误消息identifier- MATLAB 错误 IDmatlabStack- 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);