我喜欢使用mexEvalString
因为它很容易在mex中执行。但是,我得到了一些命令的异常,所以我想抓住它们以查看使用mexEvalStringWithTrap
发生的事情,但是我无法从异常中获取字符串。
基本上它只是从对象中获取一个字符串,所以我找到了mxGetProperty
和mxGetString
,但这段代码仍无效。输出为identifier: (null)
mxGetN
返回37
,但str
似乎存在问题(可能是mxGetString
的错误使用)
/* ENTRY POINT */
void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
mxArray *except, *char_ident;
mwSize strlen;
char *str;
/* ARGUMENT VERIFICATION */
//...
// catch exception
except = mexEvalStringWithTrap("unknownfunction");
// get exception identifier
char_ident = mxGetProperty(except, 0, "identifier");
// get identifier string length
strlen = (mwSize)mxGetN(char_ident);
// get identifier string
mxGetString(char_ident, str, strlen+1);
// print identifier string
printf("identifier: %s\n", str);
mexEvalStringWithTrap("drawnow");
...
答案 0 :(得分:1)
您需要在致电str
之前分配mxGetString
(尽管使用mxArrayToString
可能更容易,但请参阅底部)。
<强> testMEXException.cpp 强>
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
mxArray *except, *char_ident;
mwSize strlen;
char *str;
// catch exception
except = mexEvalStringWithTrap("unknownfunction");
// get identifier string
char_ident = mxGetProperty(except, 0, "identifier");
strlen = (mwSize)mxGetN(char_ident);
size_t buflen = strlen*sizeof(mxChar) + 1;
str = (char*)mxMalloc(buflen); // ALLOCATE
mxGetString(char_ident, str, strlen + 1);
// print identifier string
printf("identifier: %s\n", str);
mexEvalStringWithTrap("drawnow");
// get message string
char_ident = mxGetProperty(except, 0, "message");
strlen = (mwSize)mxGetN(char_ident);
buflen = strlen*sizeof(mxChar) + 1;
str = (char*)mxRealloc(str, buflen); // REALLOCATE
mxGetString(char_ident, str, strlen + 1);
// print message string
printf("message: %s\n", str);
mexEvalStringWithTrap("drawnow");
mxFree(str); // FREE
}
<强>输出强>
>> testMEXException
identifier: MATLAB:UndefinedFunction
message: Undefined function or variable 'unknownfunction'.
或者,使用mxArrayToString
,它在内部为缓冲区分配足够的空间,用于输入mxArray
中包含的整个字符串,但仍需要您释放它:
str = mxArrayToString(char_ident);
// use str ...
mxFree(str);
捕获MException
对象并访问identifier
属性的代码很好。