【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++中的处理方式.

具体的实现,请参考相应的源代码.

参考资料:

http://www.opencv.org.cn/index.php/Cxcore%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86%E5%92%8C%E7%B3%BB%E7%BB%9F%E5%87%BD%E6%95%B0

原文地址:https://www.cnblogs.com/dwdxdy/p/2599108.html