【OpenCV学习】错误处理机制
OpenCV1.0中错误处理与C语言标准函数库里的错误处理相似,设置全局错误标识,通过检查全局错误标识,来判断程序是否出现错误,并进行错误报告.
在OpenCV1.0中,如果调用函数出现错误并不直接返回错误代码,而是用CV_ERROR宏调用cvError函数报错,并设置错误状态,然后调用标准的或者用户自定义的错误处理器.
每个程序的线程都有一个全局变量,它包含了错误状(一个整数值).这个状态可以被cvGetErrStatus函数查询到.
//保存错误所在的文件和行 typedef struct { const char* file; int line; }CvStackRecord; //保存当前线程的上下文信息 typedef struct CvContext { int err_code; //错误码 int err_mode; //错误处理模式 CvErrorCallback error_callback; //错误处理函数指针入口 void* userdata; char err_msg[4096]; CvStackRecord err_ctx; } CvContext; CV_IMPL void cvError( int code, const char* func_name, const char* err_msg, const char* file_name, int line ) { if( code == CV_StsOk ) cvSetErrStatus( code ); else { CvContext* context = icvGetContext(); //获取当前上下文信息 if( code != CV_StsBackTrace && code != CV_StsAutoTrace ) { //将错误信息保存到当前上下文信息 char* message = context->err_msg; context->err_code = code; strcpy( message, err_msg ); context->err_ctx.file = file_name; context->err_ctx.line = line; } if( context->err_mode != CV_ErrModeSilent ) { //调用错误处理器进行错误处理 int terminate = context->error_callback( code, func_name, err_msg, file_name, line, context->userdata ); if( terminate ) { CV_DBG_BREAK(); //exit(-abs(terminate)); } } } }
OpenCV2.4.1中错误处理机制与上述有所不同,虽然对外接口没有发生变化,但其内部处理方式发生了变化,主要参用C++的异常处理机制.
如果调用函数出现错误并不直接返回错误代码,用CV_ERROR宏调用cvError函数,然后在cvError中调用error函数来报告错误信息.
在进入error函数之前,新建一个错误异常类,来保存当前的错误信息,然后利用这个异常类作为error函数的接口.
在error函数内,首先检测是否存在自定义的错误处理器,若存在则进入自定义的错误处器处理错误,否则,报告错误信息,并抛出错误异常.
若在错误处理处,有异常的捕获,则可以捕获该异常,用户进行相应的处理.相应的代码如下:
1 #define CV_ERROR( Code, Msg ) \ 2 { \ 3 cvError( (Code), cvFuncName, Msg, __FILE__, __LINE__ ); \ 4 __CV_EXIT__; \ 5 } 6 CV_IMPL void cvError( int code, const char* func_name, const char* err_msg, const char* file_name, int line ) 7 { 8 cv::error(cv::Exception(code, err_msg, func_name, file_name, line)); 9 } 10 void error( const Exception& exc ) 11 { 12 if (customErrorCallback != 0) //检测是否存在自定义的错误处理器 13 customErrorCallback(exc.code, exc.func.c_str(), exc.err.c_str(), 14 exc.file.c_str(), exc.line, customErrorCallbackData); 15 else 16 { 17 //报告错误信息 18 const char* errorStr = cvErrorStr(exc.code); 19 char buf[1 << 16]; 20 sprintf( buf, "OpenCV Error: %s (%s) in %s, file %s, line %d", 21 errorStr, exc.err.c_str(), exc.func.size() > 0 ? 22 exc.func.c_str() : "unknown function", exc.file.c_str(), exc.line ); 23 fprintf( stderr, "%s\n", buf ); 24 fflush( stderr ); 25 } 26 27 if(breakOnError) 28 { 29 static volatile int* p = 0; 30 *p = 0; 31 } 32 throw exc; //抛出异常 33 }
总体而言,OpenCV中的错误处理机制,从C语言的处理方式转变为C++中的处理方式.
具体的实现,请参考相应的源代码.
参考资料: