OpenCV는 자체적으로 정의된 cv::Exception을 사용하여 오류를 처리하고 있습니다.
cv::Exception은 오류 정보를 표현하기 위해 code, err, func, file 및 line이라는 멤버를 갖고 있습니다.
– code: 숫자 오류 코드 (int)
– err: 오류의 특성을 설명 (cv::String)
– func: 오류가 발생한 함수 (cv::String)
– file: 오류가 발생한 파일 (cv::String)
– line: 해당 파일에서 오류가 발생한 행의 위치 (int)
간단한 예제를 하나 만들어 보았습니다.
이전 포스팅에서 소개해 드린 OpenCV의 smart pointer를 선언만 하고, 사용하면 어떻게 될까요?
#include <iostream>
#include <opencv2/core/core.hpp>
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
try
{
cv::Ptr<Matx33f> ptr;
cout << *ptr << endl;
}
catch (cv::Exception & e)
{
cerr << "Exception: " << e.code << endl;
cerr << e.file << " - " << e.line << endl;
cerr << e.func << endl;
cerr << e.err << endl;
}
return 0;
}
당연히 exception이 발생합니다 🙁
예외를 직접 생성하는 기본 매크로를 제공하기도 합니다.
CV_Error(errorcode, description)는 고정 텍스트 설명과 함께 예외를 생성하고 throw합니다.
참고로 CV_Error_(errorcode, printf_fmt_str, [printf-args])는 동작은 동일한데, description을 printf와 같은 형식 문자열 및 인수로 바꿀 수 있습니다. 아래 예제를 참고하시기 바랍니다.
#include <iostream>
#include <opencv2/core/core.hpp>
using namespace std;
using namespace cv;
cv::Rect2d makeRect(int x, int y, int width, int height)
{
if (width < 0 || height < 0)
{
// Case 1)
//CV_Error(StsOutOfRange, "width/height must be positive number");
// Case 2)
CV_Error_(Error::StsOutOfRange,
("Width(%d) or Height(%d) is out of range", width, height));
}
return cv::Rect2d(x, y, width, height);
}
int main(int argc, char* argv[])
{
try
{
cv::Rect2d rect = makeRect(0, 0, -10000, 10000);
}
catch (cv::Exception & e)
{
cerr << "Exception: " << e.code << endl;
cerr << e.file << " - " << e.line << endl;
cerr << e.func << endl;
cerr << e.err << endl;
}
return 0;
}
width가 음수값이라서 예외가 발생했습니다.
마지막으로 CV_Assert (조건) / CV_DbgAssert(조건)은 조건을 테스트하고 조건이 충족되지 않으면 예외를 throw합니다.
이 매크로는 func, file 및 line 필드를 자동으로 처리할 수 있습니다. 아래 예제를 참고하시기 바랍니다.
※ Dbg가 붙은 함수는 디버깅용 함수입니다.
#include <iostream>
#include <opencv2/core/core.hpp>
using namespace std;
using namespace cv;
cv::Rect2d makeRect(int x, int y, int width, int height)
{
CV_Assert(width > 0 && height > 0);
return cv::Rect2d(x, y, width, height);
}
int main(int argc, char* argv[])
{
try
{
cv::Rect2d rect = makeRect(0, 0, -10000, 10000);
}
catch (cv::Exception & e)
{
cerr << "Exception: " << e.code << endl;
cerr << e.file << " - " << e.line << endl;
cerr << e.func << endl;
cerr << e.err << endl;
}
return 0;
}