1
0
Fork 0
mirror of https://github.com/ruby-opencv/ruby-opencv synced 2023-03-27 23:22:12 -04:00

modified CvError to handle errors

This commit is contained in:
ser1zw 2011-07-10 23:46:20 +09:00
parent 95777e75c1
commit 68ff16f20e
4 changed files with 140 additions and 132 deletions

View file

@ -9,7 +9,7 @@
************************************************************/
#include "cverror.h"
/*
* Document-module: OpenCV::CvError
* Document-class: OpenCV::CvError
*
* =Internal OpenCV errors
*
@ -57,75 +57,90 @@
* * CvStatusNotImplemented
* * CvStsBadMemoryBlock
*/
#define RESIST_CVERROR(object_name, error_code, parent) st_insert(cv_error, (st_data_t)error_code, (st_data_t)rb_define_class_under(rb_module_opencv(), object_name, parent))
__NAMESPACE_BEGIN_OPENCV
__NAMESPACE_BEGIN_CVERROR
st_table *cv_error = st_init_numtable();
VALUE module;
VALUE rb_klass;
void
define_ruby_module()
REGISTER_CVERROR(const char* object_name, int error_code)
{
st_insert(cv_error, (st_data_t)error_code,
(st_data_t)rb_define_class_under(rb_module_opencv(), object_name, rb_klass));
}
VALUE
rb_class()
{
return rb_klass;
}
void define_ruby_class()
{
if (rb_klass)
return;
/*
* opencv = rb_define_module("OpenCV");
*
* note: this comment is used by rdoc.
*/
VALUE opencv = rb_module_opencv();
module = rb_define_module_under(opencv, "CvError");
RESIST_CVERROR("CvStatusBackTrace", CV_StsBackTrace, rb_eStandardError);
RESIST_CVERROR("CvStatusError", CV_StsError, rb_eStandardError);
RESIST_CVERROR("CvStatusInternal", CV_StsInternal, rb_eStandardError);
RESIST_CVERROR("CvStatusNoMemory", CV_StsNoMem, rb_eNoMemError);
RESIST_CVERROR("CvStatusBadArgument", CV_StsBadArg, rb_eArgError);
RESIST_CVERROR("CvStatusBadFunction", CV_StsBadFunc, rb_eStandardError);
RESIST_CVERROR("CvStatusNoConverge", CV_StsNoConv, rb_eStandardError);
RESIST_CVERROR("CvStatusAutoTrace", CV_StsAutoTrace, rb_eStandardError);
RESIST_CVERROR("CvHeaderIsNull", CV_HeaderIsNull, rb_eStandardError);
RESIST_CVERROR("CvBadImageSize", CV_BadImageSize, rb_eRangeError);
RESIST_CVERROR("CvBadOffset", CV_BadOffset, rb_eStandardError);
RESIST_CVERROR("CvBadDataPointer", CV_BadDataPtr, rb_eStandardError);
RESIST_CVERROR("CvBadStep", CV_BadStep, rb_eStandardError);
RESIST_CVERROR("CvBadModelOrChannelSequence", CV_BadModelOrChSeq, rb_eStandardError);
RESIST_CVERROR("CvBadNumChannels", CV_BadNumChannels, rb_eStandardError);
RESIST_CVERROR("CvBadNumChannel1U", CV_BadNumChannel1U, rb_eStandardError);
RESIST_CVERROR("CvNBadDepth", CV_BadDepth, rb_eStandardError);
RESIST_CVERROR("CvBadAlphaChannel", CV_BadAlphaChannel, rb_eStandardError);
RESIST_CVERROR("CvBadOrder", CV_BadOrder, rb_eStandardError);
RESIST_CVERROR("CvBadOrigin", CV_BadOrigin, rb_eStandardError);
RESIST_CVERROR("CvBadAlign", CV_BadAlign, rb_eStandardError);
RESIST_CVERROR("CvBadCallBack", CV_BadCallBack, rb_eStandardError);
RESIST_CVERROR("CvBadTileSize", CV_BadTileSize, rb_eStandardError);
RESIST_CVERROR("CvBadCOI", CV_BadCOI, rb_eStandardError);
RESIST_CVERROR("CvBadROISize", CV_BadROISize, rb_eStandardError);
RESIST_CVERROR("CvMaskIsTiled", CV_MaskIsTiled, rb_eStandardError);
RESIST_CVERROR("CvStatusNullPointer", CV_StsNullPtr, rb_eStandardError);
RESIST_CVERROR("CvStatusVectorLengthError", CV_StsVecLengthErr, rb_eStandardError);
RESIST_CVERROR("CvStatusFilterStructContentError", CV_StsFilterStructContentErr, rb_eStandardError);
RESIST_CVERROR("CvStatusKernelStructContentError", CV_StsKernelStructContentErr, rb_eStandardError);
RESIST_CVERROR("CvStatusFilterOffsetError", CV_StsFilterOffsetErr, rb_eStandardError);
RESIST_CVERROR("CvStatusBadSize", CV_StsBadSize, rb_eStandardError);
RESIST_CVERROR("CvStatusDivByZero", CV_StsDivByZero, rb_eStandardError);
RESIST_CVERROR("CvStatusInplaceNotSupported", CV_StsInplaceNotSupported, rb_eStandardError);
RESIST_CVERROR("CvStatusObjectNotFound", CV_StsObjectNotFound, rb_eStandardError);
RESIST_CVERROR("CvStatusUnmatchedFormats", CV_StsUnmatchedFormats, rb_eStandardError);
RESIST_CVERROR("CvStatusBadFlag", CV_StsBadFlag, rb_eStandardError);
RESIST_CVERROR("CvStatusBadPoint", CV_StsBadPoint, rb_eStandardError);
RESIST_CVERROR("CvStatusBadMask", CV_StsBadMask, rb_eStandardError);
RESIST_CVERROR("CvStatusUnmatchedSizes", CV_StsUnmatchedSizes, rb_eStandardError);
RESIST_CVERROR("CvStatusUnsupportedFormat", CV_StsUnsupportedFormat, rb_eStandardError);
RESIST_CVERROR("CvStatusOutOfRange", CV_StsOutOfRange, rb_eStandardError);
RESIST_CVERROR("CvStatusParseError", CV_StsParseError, rb_eStandardError);
RESIST_CVERROR("CvStatusNotImplemented", CV_StsNotImplemented, rb_eNotImpError);
RESIST_CVERROR("CvStsBadMemoryBlock", CV_StsBadMemBlock,rb_eStandardError);
rb_klass = rb_define_class_under(opencv, "CvError", rb_eStandardError);
REGISTER_CVERROR("CvStsBackTrace", CV_StsBackTrace);
REGISTER_CVERROR("CvStsError", CV_StsError);
REGISTER_CVERROR("CvStsInternal", CV_StsInternal);
REGISTER_CVERROR("CvStsNoMem", CV_StsNoMem);
REGISTER_CVERROR("CvStsBadArg", CV_StsBadArg);
REGISTER_CVERROR("CvStsBadFunc", CV_StsBadFunc);
REGISTER_CVERROR("CvStsNoConv", CV_StsNoConv);
REGISTER_CVERROR("CvStsAutoTrace", CV_StsAutoTrace);
REGISTER_CVERROR("CvHeaderIsNull", CV_HeaderIsNull);
REGISTER_CVERROR("CvBadImageSize", CV_BadImageSize);
REGISTER_CVERROR("CvBadOffset", CV_BadOffset);
REGISTER_CVERROR("CvBadDataPtr", CV_BadDataPtr);
REGISTER_CVERROR("CvBadStep", CV_BadStep);
REGISTER_CVERROR("CvBadModelOrChSeq", CV_BadModelOrChSeq);
REGISTER_CVERROR("CvBadNumChannels", CV_BadNumChannels);
REGISTER_CVERROR("CvBadNumChannel1U", CV_BadNumChannel1U);
REGISTER_CVERROR("CvBadDepth", CV_BadDepth);
REGISTER_CVERROR("CvBadAlphaChannel", CV_BadAlphaChannel);
REGISTER_CVERROR("CvBadOrder", CV_BadOrder);
REGISTER_CVERROR("CvBadOrigin", CV_BadOrigin);
REGISTER_CVERROR("CvBadAlign", CV_BadAlign);
REGISTER_CVERROR("CvBadCallBack", CV_BadCallBack);
REGISTER_CVERROR("CvBadTileSize", CV_BadTileSize);
REGISTER_CVERROR("CvBadCOI", CV_BadCOI);
REGISTER_CVERROR("CvBadROISize", CV_BadROISize);
REGISTER_CVERROR("CvMaskIsTiled", CV_MaskIsTiled);
REGISTER_CVERROR("CvStsNullPtr", CV_StsNullPtr);
REGISTER_CVERROR("CvStsVecLengthErr", CV_StsVecLengthErr);
REGISTER_CVERROR("CvStsFilterStructContentErr", CV_StsFilterStructContentErr);
REGISTER_CVERROR("CvStsKernelStructContentErr", CV_StsKernelStructContentErr);
REGISTER_CVERROR("CvStsFilterOffsetErr", CV_StsFilterOffsetErr);
REGISTER_CVERROR("CvStsBadSize", CV_StsBadSize);
REGISTER_CVERROR("CvStsDivByZero", CV_StsDivByZero);
REGISTER_CVERROR("CvStsInplaceNotSupported", CV_StsInplaceNotSupported);
REGISTER_CVERROR("CvStsObjectNotFound", CV_StsObjectNotFound);
REGISTER_CVERROR("CvStsUnmatchedFormats", CV_StsUnmatchedFormats);
REGISTER_CVERROR("CvStsBadFlag", CV_StsBadFlag);
REGISTER_CVERROR("CvStsBadPoint", CV_StsBadPoint);
REGISTER_CVERROR("CvStsBadMask", CV_StsBadMask);
REGISTER_CVERROR("CvStsUnmatchedSizes", CV_StsUnmatchedSizes);
REGISTER_CVERROR("CvStsUnsupportedFormat", CV_StsUnsupportedFormat);
REGISTER_CVERROR("CvStsOutOfRange", CV_StsOutOfRange);
REGISTER_CVERROR("CvStsParseError", CV_StsParseError);
REGISTER_CVERROR("CvStsNotImplemented", CV_StsNotImplemented);
REGISTER_CVERROR("CvStsBadMemBlock", CV_StsBadMemBlock);
REGISTER_CVERROR("CvStsAssert", CV_StsAssert);
REGISTER_CVERROR("CvGpuNotSupported", CV_GpuNotSupported);
REGISTER_CVERROR("CvGpuApiCallError", CV_GpuApiCallError);
REGISTER_CVERROR("CvGpuNppCallError", CV_GpuNppCallError);
REGISTER_CVERROR("CvGpuCufftCallError", CV_GpuCufftCallError);
}
VALUE
@ -136,5 +151,11 @@ by_code(int error_code)
return klass ? klass : rb_eStandardError;
}
void
raise_cverror(cv::Exception e)
{
rb_raise(by_code(e.code), e.what());
}
__NAMESPACE_END_CVERROR
__NAMESPACE_END_OPENCV

View file

@ -12,66 +12,15 @@
#include "opencv.h"
#define __NAMESPACE_BEGIN_CVERROR namespace mCvError{
#define __NAMESPACE_BEGIN_CVERROR namespace cCvError {
#define __NAMESPACE_END_CVERROR }
__NAMESPACE_BEGIN_OPENCV
__NAMESPACE_BEGIN_CVERROR
/*
VALUE
status_back_trace,
status_error,
status_internal,
status_no_memory,
status_bad_argument,
status_bad_function,
status_no_converge,
status_auto_trace,
header_is_null,
bad_image_size,
bad_offset,
bad_data_pointer,
bad_step,
bad_model_or_channel_seqence,
bad_num_channels,
bad_num_channel1U,
bad_depth,
bad_alpha_channel,
bad_order,
bad_origin,
bad_align,
bad_callback,
bad_tile_size,
bad_COI,
bad_ROI_size,
mask_is_tiled,
status_null_pointer,
status_vector_length_error,
status_filter_struct_content_error,
status_kernel_struct_content_error,
status_filter_offset_error,
status_bad_size,
status_div_by_zero,
status_inplace_not_supported,
status_object_not_found,
status_unmatched_formats,
status_bad_flags,
status_bad_point,
status_bad_mask,
status_unmatched_sizes,
status_unsupported_format,
status_out_of_range,
status_parse_error,
status_not_implemented,
status_bad_memory_block;
*/
void define_ruby_module();
void define_ruby_class();
VALUE by_code(int error_code);
void raise_cverror(cv::Exception e);
__NAMESPACE_END_CVERROR
__NAMESPACE_END_OPENCV

View file

@ -138,26 +138,6 @@ rb_module_opencv()
return rb_module;
}
/*
* convert OpenCV internal error to Ruby exception.
*/
int
error_callback(int status,
const char *function_name,
const char *error_message,
const char *file_name,
int line,
void *user_data)
{
int error_code = (CvStatus)cvGetErrStatus();
if (error_code) {
OPENCV_RSTERR(); // = CV_StsOk
rb_warn("OpenCV error code (%d) : %s (%d in %s)", error_code, function_name, line, file_name);
rb_raise(mCvError::by_code(error_code), "%s", error_message);
}
return 0;
}
void
define_ruby_module()
{
@ -578,17 +558,25 @@ CREATE_CVTCOLOR_FUNC(rb_Luv2RGB, CV_Luv2RGB, 3, 3);
CREATE_CVTCOLOR_FUNC(rb_HLS2BGR, CV_HLS2BGR, 3, 3);
CREATE_CVTCOLOR_FUNC(rb_HLS2RGB, CV_HLS2RGB, 3, 3);
int
error_callback(int status, const char *function_name, const char *error_message,
const char *file_name, int line, void *user_data)
{
// dummy
return 0;
}
__NAMESPACE_END_OPENCV
extern "C"{
extern "C" {
void
Init_opencv()
{
cvRedirectError((CvErrorCallback)mOpenCV::error_callback);
mOpenCV::define_ruby_module();
mOpenCV::mCvError::define_ruby_module();
mOpenCV::cCvError::define_ruby_class();
mOpenCV::cCvPoint::define_ruby_class();
mOpenCV::cCvPoint2D32f::define_ruby_class();
mOpenCV::cCvPoint3D32f::define_ruby_class();

50
test/test_cverror.rb Executable file
View file

@ -0,0 +1,50 @@
#!/usr/bin/env ruby
# -*- mode: ruby; coding: utf-8-unix -*-
require 'test/unit'
require 'opencv'
require File.expand_path(File.dirname(__FILE__)) + '/helper'
include OpenCV
# Tests for OpenCV::CvError
class TestCvError < OpenCVTestCase
def test_cverror
assert_equal(StandardError, CvError.superclass)
begin
raise CvError
rescue
assert_equal(CvError, $!.class)
end
end
def test_subclass
errors = [CvStsOk, CvStsBackTrace, CvStsError, CvStsInternal, CvStsNoMem, CvStsBadArg, CvStsBadFunc, CvStsNoConv, CvStsAutoTrace, CvHeaderIsNull, CvBadImageSize, CvBadOffset, CvBadDataPtr, CvBadStep, CvBadModelOrChSeq, CvBadNumChannels, CvBadNumChannel1U, CvBadDepth, CvBadAlphaChannel, CvBadOrder, CvBadOrigin, CvBadAlign, CvBadCallBack, CvBadTileSize, CvBadCOI, CvBadROISize, CvMaskIsTiled, CvStsNullPtr, CvStsVecLengthErr, CvStsFilterStructContentErr, CvStsKernelStructContentErr, CvStsFilterOffsetErr, CvStsBadSize, CvStsDivByZero, CvStsInplaceNotSupported, CvStsObjectNotFound, CvStsUnmatchedFormats, CvStsBadFlag, CvStsBadPoint, CvStsBadMask, CvStsUnmatchedSizes, CvStsUnsupportedFormat, CvStsOutOfRange, CvStsParseError, CvStsNotImplemented, CvStsBadMemBlock, CvStsAssert, CvGpuNotSupported, CvGpuApiCallError, CvGpuNppCallError, CvGpuCufftCallError]
errors.each { |err|
assert_equal(CvError, err.superclass)
begin
raise err
rescue err
assert_equal(err, $!.class)
rescue
flunk("Failed to catch #{err}")
end
begin
raise err
rescue CvError
assert_equal(err, $!.class)
rescue
flunk("Failed to catch #{err}")
end
begin
raise err
rescue
assert_equal(err, $!.class)
end
}
end
end