opencv3异常想要讲明白很麻烦,俺只挑重要的说.
1. cv::Exception继承自std::exception
这一点很好,如果以前的系统考虑过如何处理std::exception,那么opencv异常系统就不会带来太大的负担,但是如果以前没有考虑过的话……
2. 用cv::redirectError注册自定义异常日志系统
int ErrorCallback(
int status/*cv::Error::Code*/,
const char* func_name,
const char* err_msg,
const char* file_name,
int line,
void* /*userdata*/) {
return 0;
}
cv::redirectError只是替换异常日志函数,无法阻止opencv对外抛异常.如果非要禁止opencv抛异常,改源代码即可.说笑的啦,强制阻止抛异常,逻辑不对啊……
3. 熟悉c++11异常系统
std::current_exception
std::rethrow_exception
std::rethrow_if_nested
std::throw_with_nested
利用以上四个函数,就可以写出一个处理所有C++异常的函数
比如下列伪代码:
/*此函数未考虑throw_with_nested/rethrow_if_nested
如果考考的话要玩递归*/
void cplusplus_exception_handle() noexcept(true) {
try{
std::rethrow_exception(std::current_exception());
}
catch(const cv::Exception &){
//add code here
}
catch(const std::exception &){
//add code here
}catch(...){
//add code here
}
}
以后写C++函数就可以
void foo(){
try{
//……
}catch(...){
cplusplus_exception_handle();
}
}
再也不用像以前一样精神分裂似得将同一段处理异常的代码copy的到处都是了
挑着重点就讲这么多,当然跳跃性比较大,看不懂不要怪我