#include
#include
#include
#include "opencv2/highgui.hpp"
#include "opencv2/core/core.hpp"
int main()
{
try {
assert(1>2);
// CV_Assert(1>2);
} catch (Exception& e) {
std::cout << e.what() << std::endl;
}
}
assert.h中的assert 的作用是计算表达式 expression ,如果其值为假(即为 0),那么它先向 stderr 打印一条出错信息,然后通过调用 abort 来终止程序运行。注意:这里会调用abort直接终止程序。
而CV_Assert是计算表达式 expression ,如果其值为假(即为 0),那么它先向 stderr 打印一条出错信息,然后抛出异常。注意:抛出异常。
这就是两者的区别,如果使用CV_Assert,我们可以通过捕获异常而不是程序崩溃,而assert会直接导致程序崩溃。上面这段代码即可验证。
#define CV_Assert( expr ) if(!!(expr)) ; else cv::error( cv::Exception(CV_StsAssert, #expr, CV_Func, __FILE__, __LINE__) )
opencv源码中可以看到,CV_Assert仅为一个宏定义调用了cv::error,其中cv::error作用为打印错误信息,并抛出异常。
void error( const Exception& exc )
{
if (customErrorCallback != 0)
customErrorCallback(exc.code, exc.func.c_str(), exc.err.c_str(),
exc.file.c_str(), exc.line, customErrorCallbackData);
else
{
const char* errorStr = cvErrorStr(exc.code);
char buf[1 << 16];
sprintf( buf, "OpenCV Error: %s (%s) in %s, file %s, line %d",
errorStr, exc.err.c_str(), exc.func.size() > 0 ?
exc.func.c_str() : "unknown function", exc.file.c_str(), exc.line );
fprintf( stderr, "%s\n", buf );
fflush( stderr );
# ifdef __ANDROID__
__android_log_print(ANDROID_LOG_ERROR, "cv::error()", "%s", buf);
# endif
}
if(breakOnError)
{
static volatile int* p = 0;
*p = 0;
}
throw exc;
}