diff options
Diffstat (limited to 'c++/src')
-rw-r--r-- | c++/src/H5AbstractDs.cpp | 3 | ||||
-rw-r--r-- | c++/src/H5AtomType.cpp | 21 | ||||
-rw-r--r-- | c++/src/H5Attribute.cpp | 18 | ||||
-rw-r--r-- | c++/src/H5CommonFG.cpp | 35 | ||||
-rw-r--r-- | c++/src/H5CommonFG.h | 2 | ||||
-rw-r--r-- | c++/src/H5CompType.cpp | 49 | ||||
-rw-r--r-- | c++/src/H5DataSet.cpp | 37 | ||||
-rw-r--r-- | c++/src/H5DataSpace.cpp | 77 | ||||
-rw-r--r-- | c++/src/H5DataType.cpp | 74 | ||||
-rw-r--r-- | c++/src/H5DcreatProp.cpp | 41 | ||||
-rw-r--r-- | c++/src/H5DxferProp.cpp | 42 | ||||
-rw-r--r-- | c++/src/H5EnumType.cpp | 12 | ||||
-rw-r--r-- | c++/src/H5Exception.cpp | 92 | ||||
-rw-r--r-- | c++/src/H5Exception.h | 58 | ||||
-rw-r--r-- | c++/src/H5FaccProp.cpp | 28 | ||||
-rw-r--r-- | c++/src/H5FcreatProp.cpp | 27 | ||||
-rw-r--r-- | c++/src/H5File.cpp | 76 | ||||
-rw-r--r-- | c++/src/H5File.h | 3 | ||||
-rw-r--r-- | c++/src/H5FloatType.cpp | 18 | ||||
-rw-r--r-- | c++/src/H5Group.cpp | 17 | ||||
-rw-r--r-- | c++/src/H5Group.h | 3 | ||||
-rw-r--r-- | c++/src/H5IdComponent.cpp | 12 | ||||
-rw-r--r-- | c++/src/H5IntType.cpp | 9 | ||||
-rw-r--r-- | c++/src/H5Library.cpp | 10 | ||||
-rw-r--r-- | c++/src/H5Object.cpp | 15 | ||||
-rw-r--r-- | c++/src/H5PredType.cpp | 4 | ||||
-rw-r--r-- | c++/src/H5PropList.cpp | 21 | ||||
-rw-r--r-- | c++/src/H5StrType.cpp | 13 |
28 files changed, 497 insertions, 320 deletions
diff --git a/c++/src/H5AbstractDs.cpp b/c++/src/H5AbstractDs.cpp index 4fa55dc..879b74a 100644 --- a/c++/src/H5AbstractDs.cpp +++ b/c++/src/H5AbstractDs.cpp @@ -37,7 +37,8 @@ H5T_class_t AbstractDs::getTypeClass() const return( type_class ); else { - throw DataTypeIException(); + throw DataTypeIException("AbstractDs::getTypeClass", + "H5Tget_class returns something different than H5T_NO_CLASS"); } } diff --git a/c++/src/H5AtomType.cpp b/c++/src/H5AtomType.cpp index bdd98b0..1ec8096 100644 --- a/c++/src/H5AtomType.cpp +++ b/c++/src/H5AtomType.cpp @@ -29,7 +29,7 @@ void AtomType::setSize( size_t size ) const herr_t ret_value = H5Tset_size( id, size ); if( ret_value < 0 ) { - throw DataTypeIException(); + throw DataTypeIException("AtomType::setSize", "H5Tset_size failed"); } } @@ -42,7 +42,8 @@ H5T_order_t AtomType::getOrder( string& order_string ) const // return a byte order constant if successful if( type_order == H5T_ORDER_ERROR ) { - throw DataTypeIException(); + throw DataTypeIException("AtomType::getOrder", + "H5Tget_order returns H5T_ORDER_ERROR"); } if( type_order == H5T_ORDER_LE ) order_string = "Little endian byte ordering (0)"; @@ -60,7 +61,7 @@ void AtomType::setOrder( H5T_order_t order ) const herr_t ret_value = H5Tset_order( id, order ); if( ret_value < 0 ) { - throw DataTypeIException(); + throw DataTypeIException("AtomType::setOrder", "H5Tset_order failed"); } } @@ -72,7 +73,8 @@ size_t AtomType::getPrecision() const // returns number of significant bits if successful if( num_signi_bits == 0 ) { - throw DataTypeIException(); + throw DataTypeIException("AtomType::getPrecision", + "H5Tget_precision returns invalid number of significant bits"); } return( num_signi_bits ); } @@ -84,7 +86,7 @@ void AtomType::setPrecision( size_t precision ) const herr_t ret_value = H5Tset_precision( id, precision ); if( ret_value < 0 ) { - throw DataTypeIException(); + throw DataTypeIException("AtomType::setPrecision", "H5Tset_precision failed"); } } @@ -99,7 +101,8 @@ int AtomType::getOffset() const // returns a non-negative offset value if successful if( offset == -1 ) { - throw DataTypeIException(); + throw DataTypeIException("AtomType::getOffset", + "H5Tget_offset returns a negative offset value"); } return( offset ); } @@ -111,7 +114,7 @@ void AtomType::setOffset( size_t offset ) const herr_t ret_value = H5Tset_offset( id, offset ); if( ret_value < 0 ) { - throw DataTypeIException(); + throw DataTypeIException("AtomType::setOffset", "H5Tset_offset failed"); } } @@ -123,7 +126,7 @@ void AtomType::setOffset( size_t offset ) const //herr_t ret_value = H5Tget_pad( id, &lsb, &msb ); //if( ret_value < 0 ) //{ - //throw DataTypeIException(); + //throw DataTypeIException("AtomType::getPad", "H5Tget_pad failed"); //} //} @@ -134,7 +137,7 @@ void AtomType::setOffset( size_t offset ) const //herr_t ret_value = H5Tset_pad( id, lsb, msb ); //if( ret_value < 0 ) //{ - //throw DataTypeIException(); + //throw DataTypeIException("AtomType::setPad", "H5Tset_pad failed"); //} //} diff --git a/c++/src/H5Attribute.cpp b/c++/src/H5Attribute.cpp index 03b50b9..de184a5 100644 --- a/c++/src/H5Attribute.cpp +++ b/c++/src/H5Attribute.cpp @@ -29,7 +29,7 @@ void Attribute::write( const DataType& mem_type, void *buf ) const herr_t ret_value = H5Awrite( id, mem_type.getId(), buf ); if( ret_value < 0 ) { - throw AttributeIException(); + throw AttributeIException("Attribute::write", "H5Awrite failed"); } } @@ -39,7 +39,7 @@ void Attribute::read( const DataType& mem_type, void *buf ) const herr_t ret_value = H5Aread( id, mem_type.getId(), buf ); if( ret_value < 0 ) { - throw AttributeIException(); + throw AttributeIException("Attribute::read", "H5Aread failed"); } } @@ -57,7 +57,7 @@ DataSpace Attribute::getSpace() const } else { - throw AttributeIException(); + throw AttributeIException("Attribute::getSpace", "H5Aget_space failed"); } } @@ -72,7 +72,7 @@ hid_t Attribute::p_getType() const return( type_id ); else { - throw AttributeIException(); + throw AttributeIException(NULL, "H5Aget_type failed"); } } @@ -87,7 +87,7 @@ string Attribute::getName( size_t buf_size ) const // If H5Aget_name returns a negative value, raise an exception, if( name_size < 0 ) { - throw AttributeIException(); + throw AttributeIException("Attribute::getName", "H5Aget_name failed"); } // otherwise, create the string to hold the attribute name and return it string name = string( name_C ); @@ -102,7 +102,7 @@ void Attribute::p_close() const herr_t ret_value = H5Aclose( id ); if( ret_value < 0 ) { - throw AttributeIException(); + throw AttributeIException(NULL, "H5Aclose failed"); } } @@ -114,7 +114,11 @@ void Attribute::p_close() const Attribute::~Attribute() { // The attribute id will be closed properly - resetIdComponent( this ); + try { + resetIdComponent( this ); } + catch (Exception close_error) { // thrown by p_close + throw AttributeIException("Attribute::~Attribute", close_error.getDetailMsg()); + } } #ifndef H5_NO_NAMESPACE diff --git a/c++/src/H5CommonFG.cpp b/c++/src/H5CommonFG.cpp index 000729b..ae6a2bd 100644 --- a/c++/src/H5CommonFG.cpp +++ b/c++/src/H5CommonFG.cpp @@ -55,8 +55,7 @@ Group CommonFG::createGroup( const char* name, size_t size_hint ) const } else { - //throw File_GroupException(); - throwException(); + throwException("createGroup", "H5Gcreate failed"); } } @@ -79,7 +78,7 @@ Group CommonFG::openGroup( const char* name ) const } else { - throwException(); + throwException("openGroup", "H5Gopen failed"); } } @@ -106,7 +105,7 @@ DataSet CommonFG::createDataSet( const char* name, const DataType& data_type, co } else { - throwException(); + throwException("createDataSet", "H5Dcreate failed"); } } @@ -129,7 +128,7 @@ DataSet CommonFG::openDataSet( const char* name ) const } else { - throwException(); + throwException("openDataSet", "H5Dopen failed"); } } @@ -144,7 +143,7 @@ void CommonFG::link( H5G_link_t link_type, const char* curr_name, const char* ne herr_t ret_value = H5Glink( getLocId(), link_type, curr_name, new_name ); if( ret_value < 0 ) { - throwException(); + throwException("link", "H5Glink failed"); } } @@ -158,7 +157,7 @@ void CommonFG::unlink( const char* name ) const herr_t ret_value = H5Gunlink( getLocId(), name ); if( ret_value < 0 ) { - throwException(); + throwException("unlink", "H5Gunlink failed"); } } @@ -172,7 +171,7 @@ void CommonFG::move( const char* src, const char* dst ) const herr_t ret_value = H5Gmove( getLocId(), src, dst ); if( ret_value < 0 ) { - throwException(); + throwException("move", "H5Gmove failed"); } } @@ -186,7 +185,7 @@ void CommonFG::getObjinfo( const char* name, hbool_t follow_link, H5G_stat_t& st herr_t ret_value = H5Gget_objinfo( getLocId(), name, follow_link, &statbuf ); if( ret_value < 0 ) { - throwException(); + throwException("getObjinfo", "H5Gget_objinfo failed"); } } @@ -202,7 +201,7 @@ string CommonFG::getLinkval( const char* name, size_t size ) const herr_t ret_value = H5Gget_linkval( getLocId(), name, size, value_C ); if( ret_value < 0 ) { - throwException(); + throwException("getLinkval", "H5Gget_linkval failed"); } string value = string( value_C ); delete value_C; @@ -219,7 +218,7 @@ void CommonFG::setComment( const char* name, const char* comment ) const herr_t ret_value = H5Gset_comment( getLocId(), name, comment ); if( ret_value < 0 ) { - throwException(); + throwException("setComment", "H5Gset_comment failed"); } } @@ -238,7 +237,7 @@ string CommonFG::getComment( const char* name, size_t bufsize ) const // if H5Gget_comment returns SUCCEED, return the string comment if( ret_value < 0 ) { - throwException(); + throwException("getComment", "H5Gget_comment failed"); } string comment = string( comment_C ); delete comment_C; @@ -262,7 +261,7 @@ void CommonFG::mount( const char* name, H5File& child, PropList& plist ) const // Raise exception if H5Fmount returns negative value if( ret_value < 0 ) { - throwException(); + throwException("mount", "H5Fmount failed"); } } @@ -279,7 +278,7 @@ void CommonFG::unmount( const char* name ) const // Raise exception if H5Funmount returns negative value if( ret_value < 0 ) { - throwException(); + throwException("unmount", "H5Funmount failed"); } } @@ -289,7 +288,7 @@ void CommonFG::unmount( const char* name ) const hid_t CommonFG::p_openDataType( const char* name ) const { // Call C function H5Topen to open the named datatype in this group, - // giving the group id + // giving either the file or group id hid_t datatype_id = H5Topen( getLocId(), name ); // If the datatype id is valid, return it, otherwise, throw an exception. @@ -297,7 +296,7 @@ hid_t CommonFG::p_openDataType( const char* name ) const return( datatype_id ); else { - throwException(); + throwException("openDataType", "H5Topen failed"); } } @@ -382,9 +381,9 @@ int CommonFG::iterateElems( const char* name, int *idx, H5G_iterate_t op , void* int ret_value = H5Giterate( getLocId(), name, idx, op, op_data ); if( ret_value >= 0 ) return( ret_value ); - else // raise exception when H5Aiterate returns a negative value + else // raise exception when H5Giterate returns a negative value { - throwException(); + throwException("iterateElems", "H5Giterate failed"); } } diff --git a/c++/src/H5CommonFG.h b/c++/src/H5CommonFG.h index ed34a20..4557293 100644 --- a/c++/src/H5CommonFG.h +++ b/c++/src/H5CommonFG.h @@ -102,7 +102,7 @@ class CommonFG { StrType openStrType( const char* name ) const; // for H5File and Group to throw appropriate exception - virtual void throwException() const = 0; + virtual void throwException(const string& func_name, const string& msg) const = 0; CommonFG(); virtual ~CommonFG(); diff --git a/c++/src/H5CompType.cpp b/c++/src/H5CompType.cpp index c4143df..0bfa220 100644 --- a/c++/src/H5CompType.cpp +++ b/c++/src/H5CompType.cpp @@ -11,6 +11,7 @@ #include "H5DxferProp.h" #include "H5DataSpace.h" #include "H5DataSet.h" +#include "H5private.h" #ifndef H5_NO_NAMESPACE namespace H5 { @@ -37,7 +38,7 @@ CompType::CompType( const DataSet& dataset ) : DataType() // If the datatype id is invalid, throw exception if( id <= 0 ) { - throw DataSetIException(); + throw DataSetIException("CompType constructor", "H5Dget_type failed"); } } @@ -47,7 +48,8 @@ int CompType::getNmembers() const int num_members = H5Tget_nmembers( id ); if( num_members < 0 ) { - throw DataTypeIException(); + throw DataTypeIException("CompType::getNmembers", + "H5Tget_nmembers returns negative number of members"); } return( num_members ); } @@ -55,13 +57,15 @@ int CompType::getNmembers() const // Retrieves the name of a member of this compound datatype. string CompType::getMemberName( int member_num ) const { - char* member_name_C = H5Tget_member_name( id, member_num ); - if( member_name_C == NULL ) // should this be returned also??? - { - throw DataTypeIException(); - } - string member_name = string( member_name_C ); - return( member_name ); + char* member_name_C = H5Tget_member_name( id, member_num ); + if( member_name_C == NULL ) // NULL means failure + { + throw DataTypeIException("CompType::getMemberName", + "H5Tget_member_name returns NULL for member name"); + } + string member_name = string(member_name_C); // convert C string to string + HDfree(member_name_C); // free the C string + return( member_name ); // return the member name string } // Retrieves the offset of a member of a compound datatype. @@ -71,7 +75,8 @@ size_t CompType::getMemberOffset( int member_num ) const // Q. said: for now, 0 is not a failure //if( offset == 0 ) //{ - //throw DataTypeIException(); + //throw DataTypeIException("CompType::getMemberOffset", + //"H5Tget_member_offset failed"); //} return( offset ); } @@ -80,7 +85,8 @@ size_t CompType::getMemberOffset( int member_num ) const int CompType::getMemberDims( int member_num, size_t* dims, int* perm ) const { throw DataTypeIException( "Error: getMemberDims is no longer supported." ); - return (-1); + return (-1); // unreachable statement; but without it, the compiler + // will complain } // Gets the type class of the specified member. @@ -90,29 +96,35 @@ H5T_class_t CompType::getMemberClass( int member_num ) const hid_t member_type_id = H5Tget_member_type( id, member_num ); if( member_type_id <= 0 ) { - throw DataTypeIException(); + throw DataTypeIException("CompType::getMemberClass", + "H5Tget_member_type failed"); } // then get its class H5T_class_t member_class = H5Tget_class( member_type_id ); if( member_class == H5T_NO_CLASS ) { - throw DataTypeIException(); + throw DataTypeIException("CompType::getMemberClass", + "H5Tget_class returns H5T_NO_CLASS"); } return( member_class ); } // This private member function calls the C API to get the identifier -// of the specified member. It is used by the getMemberXxxType -// below for the sub-types. +// of the specified member. It provides the id to construct appropriate +// sub-types in the functions getMemberXxxType below, where Xxx indicates +// the sub-types. hid_t CompType::p_getMemberType( int member_num ) const { + // get the id of the specified member first hid_t member_type_id = H5Tget_member_type( id, member_num ); if( member_type_id > 0 ) return( member_type_id ); else { - throw DataTypeIException(); + // p_getMemberType is private, use caller's function name for api + throw DataTypeIException("CompType::getMemberDataType", + "H5Tget_member_type failed"); } } @@ -155,6 +167,7 @@ StrType CompType::getMemberStrType( int member_num ) const /* old style of getMemberType - using overloads; new style above returns the appropriate datatypes but has different named functions. + In the old style, a datatype must be passed into the function. // Returns the datatype of the specified member in this compound datatype. // Several overloading of getMemberType are for different datatypes void CompType::getMemberType( int member_num, EnumType& enumtype ) const @@ -197,7 +210,7 @@ void CompType::insertMember( const string name, size_t offset, const DataType& n herr_t ret_value = H5Tinsert( id, name_C, offset, new_member_id ); if( ret_value < 0 ) { - throw DataTypeIException(); + throw DataTypeIException("CompType::insertMember", "H5Tinsert failed"); } } @@ -208,7 +221,7 @@ void CompType::pack() const herr_t ret_value = H5Tpack( id ); if( ret_value < 0 ) { - throw DataTypeIException(); + throw DataTypeIException("CompType::pack", "H5Tpack failed"); } } diff --git a/c++/src/H5DataSet.cpp b/c++/src/H5DataSet.cpp index 883d1d3..0f91298 100644 --- a/c++/src/H5DataSet.cpp +++ b/c++/src/H5DataSet.cpp @@ -38,7 +38,7 @@ DataSpace DataSet::getSpace() const // If the dataspace id is invalid, throw an exception if( dataspace_id <= 0 ) { - throw DataSetIException(); + throw DataSetIException("DataSet::getSpace", "H5Dget_space failed"); } //create dataspace object using the existing id then return the object DataSpace data_space( dataspace_id ); @@ -55,7 +55,7 @@ hid_t DataSet::p_getType() const return( type_id ); else { - throw DataSetIException(); + throw DataSetIException(NULL, "H5Dget_type failed"); } } @@ -65,7 +65,7 @@ DSetCreatPropList DataSet::getCreatePlist() const hid_t create_plist_id = H5Dget_create_plist( id ); if( create_plist_id <= 0 ) { - throw DataSetIException(); + throw DataSetIException("DataSet::getCreatePlist", "H5Dget_create_plist failed"); } // create and return the DSetCreatPropList object DSetCreatPropList create_plist( create_plist_id ); @@ -77,47 +77,46 @@ hsize_t DataSet::getStorageSize() const { hsize_t storage_size = H5Dget_storage_size( id ); - if( storage_size > 0 ) + if( storage_size > 0 ) // checking with Quincey for failure value - BMR return( storage_size ); else { - throw DataSetIException(); + throw DataSetIException("DataSet::getStorageSize", "H5Dget_storage_size failed"); } } // Returns the number of bytes required to store VL data. hsize_t DataSet::getVlenBufSize( DataType& type, DataSpace& space ) const { - //herr_t ret_value; // Obtain identifiers for C API //hid_t type_id = type.getId(); //hid_t space_id = space.getId(); //hsize_t size; - throw DataSetIException( "getVlenBufSize: Currently not implemented yet."); - //ret_value = H5Dget_vlen_buf_size( id, type_id, space_id, &size ); + //herr_t ret_value = H5Dget_vlen_buf_size( id, type_id, space_id, &size ); //if( ret_value >= 0 ) // return( size ); //else //{ //throw DataSetIException(); //} + throw DataSetIException( "DataSet::getVlenBufSize", + "Currently not implemented yet."); return (0); } // Reclaims VL datatype memory buffers. void DataSet::vlenReclaim( DataType& type, DataSpace& space, DSetMemXferPropList& xfer_plist, void* buf ) const { - herr_t ret_value; // Obtain identifiers for C API hid_t type_id = type.getId(); hid_t space_id = space.getId(); hid_t xfer_plist_id = xfer_plist.getId(); - ret_value = H5Dvlen_reclaim( type_id, space_id, xfer_plist_id, buf ); + herr_t ret_value = H5Dvlen_reclaim( type_id, space_id, xfer_plist_id, buf ); if( ret_value < 0 ) { - throw DataSetIException(); + throw DataSetIException("DataSet::vlenReclaim", "H5Dvlen_reclaim failed"); } } @@ -134,7 +133,7 @@ void DataSet::read( void* buf, const DataType& mem_type, const DataSpace& mem_sp herr_t ret_value = H5Dread( id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf ); if( ret_value < 0 ) { - throw DataSetIException(); + throw DataSetIException("DataSet::read", "H5Dread failed"); } } @@ -152,7 +151,7 @@ void DataSet::write( const void* buf, const DataType& mem_type, const DataSpace& herr_t ret_value = H5Dwrite( id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf ); if( ret_value < 0 ) { - throw DataSetIException(); + throw DataSetIException("DataSet::write", "H5Dwrite failed"); } } @@ -167,7 +166,7 @@ int DataSet::iterateElems( void* buf, const DataType& type, const DataSpace& spa return( ret_value ); else // raise exception when H5Diterate returns a negative value { - throw DataSetIException(); + throw DataSetIException("DataSet::iterateElems", "H5Diterate failed"); } } @@ -177,7 +176,7 @@ void DataSet::extend( const hsize_t* size ) const herr_t ret_value = H5Dextend( id, size ); if( ret_value < 0 ) // raise exception when H5Dextend returns a neg value { - throw DataSetIException(); + throw DataSetIException("DataSet::extend", "H5Dextend failed"); } } @@ -188,7 +187,7 @@ void DataSet::p_close() const herr_t ret_value = H5Dclose( id ); if( ret_value < 0 ) { - throw DataSetIException(); + throw DataSetIException(NULL, "H5Dclose failed"); } } @@ -200,7 +199,11 @@ void DataSet::p_close() const DataSet::~DataSet() { // The dataset id will be closed properly - resetIdComponent( this ); + try { + resetIdComponent( this ); } + catch (Exception close_error) { // thrown by p_close + throw DataSetIException("DataSet::~DataSet", close_error.getDetailMsg()); + } } #ifndef H5_NO_NAMESPACE diff --git a/c++/src/H5DataSpace.cpp b/c++/src/H5DataSpace.cpp index 3e1d922..dc4ed9a 100644 --- a/c++/src/H5DataSpace.cpp +++ b/c++/src/H5DataSpace.cpp @@ -22,7 +22,7 @@ DataSpace::DataSpace( H5S_class_t type ) : IdComponent() id = H5Screate( type ); if( id <= 0 ) { - throw DataSpaceIException(); + throw DataSpaceIException("DataSpace constructor", "H5Screate failed"); } } @@ -32,7 +32,7 @@ DataSpace::DataSpace( int rank, const hsize_t * dims, const hsize_t * maxdims) : id = H5Screate_simple( rank, dims, maxdims ); if( id <= 0 ) { - throw DataSpaceIException(); + throw DataSpaceIException("DataSpace constructor", "H5Screate_simple failed"); } } @@ -50,17 +50,21 @@ void DataSpace::copy( const DataSpace& like_space ) { // reset the identifier of this instance - send 'this' in so that // H5Sclose can be called appropriately - resetIdComponent( this ); + try { + resetIdComponent( this ); } + catch (Exception close_error) { // thrown by p_close + throw DataSpaceIException("DataSpace::copy", close_error.getDetailMsg()); + } // call C routine to copy the dataspace id = H5Scopy( like_space.getId() ); - // points to the same ref counter + // new ref counter for this id ref_count = new RefCounter; if( id <= 0 ) { - throw DataSpaceIException(); + throw DataSpaceIException("DataSpace::copy", "H5Scopy failed"); } } @@ -74,7 +78,8 @@ bool DataSpace::isSimple () const return false; else { - throw DataSpaceIException(); + throw DataSpaceIException("DataSpace::isSimple", + "H5Sis_simple returns negative value"); } } @@ -84,7 +89,7 @@ void DataSpace::offsetSimple ( const hssize_t* offset ) const herr_t ret_value = H5Soffset_simple( id, offset ); if( ret_value < 0 ) { - throw DataSpaceIException(); + throw DataSpaceIException("DataSpace::offsetSimple", "H5Soffset_simple failed"); } } @@ -94,7 +99,8 @@ int DataSpace::getSimpleExtentDims ( hsize_t *dims, hsize_t *maxdims ) const int ndims = H5Sget_simple_extent_dims( id, dims, maxdims ); if( ndims < 0 ) { - throw DataSpaceIException(); + throw DataSpaceIException("DataSpace::getSimpleExtentDims", + "H5Sget_simple_extent_dims returns negative number of dimensions"); } return( ndims ); } @@ -105,7 +111,8 @@ int DataSpace::getSimpleExtentNdims () const int ndims = H5Sget_simple_extent_ndims( id ); if( ndims < 0 ) { - throw DataSpaceIException(); + throw DataSpaceIException("DataSpace::getSimpleExtentNdims", + "H5Sget_simple_extent_ndims returns negative value for dimensionality of the dataspace"); } return( ndims ); } @@ -122,7 +129,8 @@ hssize_t DataSpace::getSimpleExtentNpoints () const return( num_elements ); else { - throw DataSpaceIException(); + throw DataSpaceIException("DataSpace::getSimpleExtentNpoints", + "H5Sget_simple_extent_npoints returns negative value for the number of elements in the dataspace"); } } @@ -132,7 +140,8 @@ H5S_class_t DataSpace::getSimpleExtentType () const H5S_class_t class_name = H5Sget_simple_extent_type( id ); if( class_name == H5S_NO_CLASS ) { - throw DataSpaceIException(); + throw DataSpaceIException("DataSpace::getSimpleExtentType", + "H5Sget_simple_extent_type returns H5S_NO_CLASS"); } return( class_name ); } @@ -144,7 +153,7 @@ void DataSpace::extentCopy ( DataSpace& dest_space ) const herr_t ret_value = H5Sextent_copy( dest_space_id, id ); if( ret_value < 0 ) { - throw DataSpaceIException(); + throw DataSpaceIException("DataSpace::extentCopy", "H5Sextent_copy failed"); } } @@ -155,7 +164,7 @@ void DataSpace::setExtentSimple( int rank, const hsize_t *current_size, const hs ret_value = H5Sset_extent_simple( id, rank, current_size, maximum_size ); if( ret_value < 0 ) { - throw DataSpaceIException(); + throw DataSpaceIException("DataSpace::setExtentSimple", "H5Sset_extent_simple failed"); } } @@ -165,7 +174,7 @@ void DataSpace::setExtentNone () const herr_t ret_value = H5Sset_extent_none( id ); if( ret_value < 0 ) { - throw DataSpaceIException(); + throw DataSpaceIException("DataSpace::setExtentNone", "H5Sset_extent_none failed"); } } @@ -175,7 +184,8 @@ hssize_t DataSpace::getSelectNpoints () const hssize_t num_elements = H5Sget_select_npoints( id ); if( num_elements < 0 ) { - throw DataSpaceIException(); + throw DataSpaceIException("DataSpace::getSelectNpoints", + "H5Sget_select_npoints returns negative value for number of elements in the dataspace selection"); } return( num_elements ); } @@ -186,7 +196,8 @@ hssize_t DataSpace::getSelectHyperNblocks () const hssize_t num_blocks = H5Sget_select_hyper_nblocks( id ); if( num_blocks < 0 ) { - throw DataSpaceIException(); + throw DataSpaceIException("DataSpace::getSelectHyperNblocks", + "H5Sget_select_hyper_nblocks returns negative value for the number of hyperslab blocks"); } return( num_blocks ); } @@ -198,7 +209,8 @@ void DataSpace::getSelectHyperBlocklist( hsize_t startblock, hsize_t numblocks, ret_value = H5Sget_select_hyper_blocklist( id, startblock, numblocks, buf ); if( ret_value < 0 ) { - throw DataSpaceIException(); + throw DataSpaceIException("DataSpace::getSelectHyperBlocklist", + "H5Sget_select_hyper_blocklist failed"); } } @@ -208,7 +220,8 @@ hssize_t DataSpace::getSelectElemNpoints () const hssize_t num_points = H5Sget_select_elem_npoints( id ); if( num_points < 0 ) { - throw DataSpaceIException(); + throw DataSpaceIException("DataSpace::getSelectElemNpoints", + "H5Sget_select_elem_npoints failed"); } return( num_points ); } @@ -220,7 +233,8 @@ void DataSpace::getSelectElemPointlist ( hsize_t startpoint, hsize_t numpoints, ret_value = H5Sget_select_elem_pointlist( id, startpoint, numpoints, buf ); if( ret_value < 0 ) { - throw DataSpaceIException(); + throw DataSpaceIException("DataSpace::getSelectElemPointlist", + "H5Sget_select_elem_pointlist failed"); } } @@ -230,7 +244,8 @@ void DataSpace::getSelectBounds ( hsize_t* start, hsize_t* end ) const herr_t ret_value = H5Sget_select_bounds( id, start, end ); if( ret_value < 0 ) { - throw DataSpaceIException(); + throw DataSpaceIException("DataSpace::getSelectBounds", + "H5Sget_select_bounds failed"); } } @@ -241,7 +256,8 @@ void DataSpace::selectElements ( H5S_seloper_t op, const size_t num_elements, co ret_value = H5Sselect_elements( id, op, num_elements, coord ); if( ret_value < 0 ) { - throw DataSpaceIException(); + throw DataSpaceIException("DataSpace::selectElements", + "H5Sselect_elements failed"); } } @@ -251,7 +267,7 @@ void DataSpace::selectAll () const herr_t ret_value = H5Sselect_all( id ); if( ret_value < 0 ) { - throw DataSpaceIException(); + throw DataSpaceIException("DataSpace::selectAll", "H5Sselect_all failed"); } } @@ -261,7 +277,8 @@ void DataSpace::selectNone () const herr_t ret_value = H5Sselect_none( id ); if( ret_value < 0 ) { - throw DataSpaceIException(); + throw DataSpaceIException("DataSpace::selectNone", + "H5Sselect_none failed"); } } @@ -275,7 +292,8 @@ bool DataSpace::selectValid () const return false; else { - throw DataSpaceIException(); + throw DataSpaceIException("DataSpace::selectValid", + "H5Sselect_valid returns negative value"); } } @@ -286,7 +304,8 @@ void DataSpace::selectHyperslab( H5S_seloper_t op, const hsize_t *count, const h ret_value = H5Sselect_hyperslab( id, op, start, stride, count, block ); if( ret_value < 0 ) { - throw DataSpaceIException(); + throw DataSpaceIException("DataSpace::selectHyperslab", + "H5Sselect_hyperslab failed"); } } @@ -299,7 +318,7 @@ void DataSpace::p_close() const herr_t ret_value = H5Sclose( space_id ); if( ret_value < 0 ) { - throw DataSpaceIException(); + throw DataSpaceIException(NULL, "H5Sclose failed"); } } } @@ -312,7 +331,11 @@ void DataSpace::p_close() const DataSpace::~DataSpace() { // The dataspace id will be closed properly - resetIdComponent( this ); + try { + resetIdComponent( this ); } + catch (Exception close_error) { // thrown by p_close + throw DataSpaceIException("DataSpace::~DataSpace", close_error.getDetailMsg()); + } } #ifndef H5_NO_NAMESPACE diff --git a/c++/src/H5DataType.cpp b/c++/src/H5DataType.cpp index 889d233..e8c00eb 100644 --- a/c++/src/H5DataType.cpp +++ b/c++/src/H5DataType.cpp @@ -10,6 +10,7 @@ #include "H5DataType.h" #include "H5AtomType.h" #include "H5PredType.h" +#include "H5private.h" #ifndef H5_NO_NAMESPACE namespace H5 { @@ -29,7 +30,7 @@ DataType::DataType( const H5T_class_t type_class, size_t size ) : H5Object(), is id = H5Tcreate( type_class, size ); if( id <= 0 ) { - throw DataTypeIException(); + throw DataTypeIException("DataType constructor", "H5Tcreate failed"); } } @@ -49,28 +50,25 @@ void DataType::copy( const DataType& like_type ) { // reset the identifier of this instance, H5Tclose will be called // if needed - resetIdComponent( this ); + try { + resetIdComponent( this ); } + catch (Exception close_error) { // thrown by p_close + throw DataTypeIException("DataType::copy", close_error.getDetailMsg()); + } // call C routine to copy the datatype id = H5Tcopy( like_type.getId() ); - ref_count = new RefCounter; - -/* -id != like_type.id so this object has a different ref_count than -like_type - ref_count = like_type.ref_count; - // increment ref counter to indicate additional references to this id - ref_count->increment(); -*/ + // new reference counter for this id + ref_count = new RefCounter; if( id <= 0 ) { - throw DataTypeIException(); + throw DataTypeIException("DataType::copy", "H5Tcopy failed"); } } -// Determines whether two datatypes are the same. ??? +// Determines whether two datatypes refer to the same actual datatype. bool DataType::operator==(const DataType& compared_type ) const { // Call C routine H5Tequal to determines whether two datatype @@ -82,18 +80,20 @@ bool DataType::operator==(const DataType& compared_type ) const return false; else { - throw DataTypeIException(); + throw DataTypeIException("DataType::operator==", + "H5Tequal returns negative value"); } } // Operates a user's function on each attribute of an object - commented // out because it should use the one from H5Object; need to check -// the parameter list??? +// the parameter list??? - work in progress //int DataType::iterate( unsigned * idx, H5A_operator_t op, void *op_data ) //{ //} // Creates a new variable-length datatype - Note: make it inheritance??? +// work in progress //DataType DataType::vlenCreate( const DataType& base_type ) //{ //} @@ -111,7 +111,7 @@ void DataType::commit( H5Object& loc, const char* name ) const herr_t ret_value = H5Tcommit( loc_id, name, id ); if( ret_value < 0 ) { - throw DataTypeIException(); + throw DataTypeIException("DataType::commit", "H5Tcommit failed"); } } @@ -126,7 +126,7 @@ bool DataType::committed() const return false; else { - throw DataTypeIException(); + throw DataTypeIException("DataType::committed", "H5Tcommitted return negative value"); } } @@ -137,7 +137,7 @@ H5T_conv_t DataType::find( const DataType& dest, H5T_cdata_t **pcdata ) const H5T_conv_t func = H5Tfind( id, dest.getId(), pcdata ); if( func == NULL ) { - throw DataTypeIException(); + throw DataTypeIException("DataType::find", "H5Tfind returns a NULL function"); } return( func ); } @@ -154,7 +154,7 @@ void DataType::convert( const DataType& dest, size_t nelmts, void *buf, void *ba ret_value = H5Tconvert( id, dest_id, nelmts, buf, background, plist_id ); if( ret_value < 0 ) { - throw DataTypeIException(); + throw DataTypeIException("DataType::convert", "H5Tconvert failed"); } } @@ -165,7 +165,7 @@ void DataType::setOverflow( H5T_overflow_t func ) const herr_t ret_value = H5Tset_overflow( func ); if( ret_value < 0 ) { - throw DataTypeIException(); + throw DataTypeIException("DataType::setOverflow", "H5Tset_overflow failed"); } } @@ -183,7 +183,7 @@ void DataType::lock() const herr_t ret_value = H5Tlock( id ); if( ret_value < 0 ) { - throw DataTypeIException(); + throw DataTypeIException("DataType::lock", "H5Tlock failed"); } } @@ -195,7 +195,8 @@ H5T_class_t DataType::getClass() const // Return datatype class identifier if successful if( type_class == H5T_NO_CLASS ) { - throw DataTypeIException(); + throw DataTypeIException("DataType::getClass", + "H5Tget_class returns H5T_NO_CLASS"); } return( type_class ); } @@ -205,9 +206,10 @@ size_t DataType::getSize() const { // Call C routine to get the datatype size size_t type_size = H5Tget_size( id ); - if( type_size <= 0 ) // Is 0 valid value ??? + if( type_size <= 0 ) // valid data types are never zero size { - throw DataTypeIException(); + throw DataTypeIException("DataType::getSize", + "H5Tget_size returns invalid datatype size"); } return( type_size ); } @@ -229,7 +231,7 @@ DataType DataType::getSuper() const } else { - throw DataTypeIException(); + throw DataTypeIException("DataType::getSuper", "H5Tget_super failed"); } } @@ -246,7 +248,7 @@ void DataType::registerFunc( H5T_pers_t pers, const char* name, const DataType& herr_t ret_value = H5Tregister( pers, name, id, dest_id, func ); if( ret_value < 0 ) { - throw DataTypeIException(); + throw DataTypeIException("DataType::registerFunc", "H5Tregister failed"); } } @@ -263,7 +265,7 @@ void DataType::unregister( H5T_pers_t pers, const char* name, const DataType& de herr_t ret_value = H5Tunregister( pers, name, id, dest_id, func ); if( ret_value < 0 ) { - throw DataTypeIException(); + throw DataTypeIException("DataType::unregister", "H5Tunregister failed"); } } @@ -278,7 +280,7 @@ void DataType::setTag( const char* tag ) const herr_t ret_value = H5Tset_tag( id, tag ); if( ret_value < 0 ) { - throw DataTypeIException(); + throw DataTypeIException("DataType::setTag", "H5Tset_tag failed"); } } @@ -291,12 +293,14 @@ string DataType::getTag() const // and return it, otherwise, raise an exception if( tag_Cstr != NULL ) { - string tag = string( tag_Cstr ); - return( tag ); + string tag = string(tag_Cstr); // convert C string to string object + HDfree(tag_Cstr); // free the C string + return (tag); // return the tag } else { - throw DataTypeIException(); + throw DataTypeIException("DataType::getTag", + "H5Tget_tag returns NULL for tag"); } } @@ -310,7 +314,7 @@ void DataType::p_close() const herr_t ret_value = H5Tclose( id ); if( ret_value < 0 ) { - throw DataTypeIException(); + throw DataTypeIException(NULL, "H5Tclose failed"); } } } @@ -323,7 +327,11 @@ void DataType::p_close() const DataType::~DataType() { // The datatype id will be closed properly - resetIdComponent( this ); + try { + resetIdComponent( this ); } + catch (Exception close_error) { // thrown by p_close + throw DataTypeIException("DataType::~DataType", close_error.getDetailMsg()); + } } #ifndef H5_NO_NAMESPACE diff --git a/c++/src/H5DcreatProp.cpp b/c++/src/H5DcreatProp.cpp index 39b653e..4f3d2e4 100644 --- a/c++/src/H5DcreatProp.cpp +++ b/c++/src/H5DcreatProp.cpp @@ -24,7 +24,7 @@ void DSetCreatPropList::setChunk( int ndims, const hsize_t* dim ) const herr_t ret_value = H5Pset_chunk( id, ndims, dim ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("DSetCreatPropList::setChunk", "H5Pset_chunk failed"); } } @@ -35,7 +35,8 @@ H5D_layout_t DSetCreatPropList::getLayout() const H5D_layout_t layout = H5Pget_layout( id ); if( layout == H5D_LAYOUT_ERROR ) { - throw PropListIException(); + throw PropListIException("DSetCreatPropList::getLayout", + "H5Pget_layout returns H5D_LAYOUT_ERROR"); } return( layout ); } @@ -46,7 +47,8 @@ int DSetCreatPropList::getChunk( int max_ndims, hsize_t* dim ) const int chunk_size = H5Pget_chunk( id, max_ndims, dim ); if( chunk_size < 0 ) { - throw PropListIException(); + throw PropListIException("DSetCreatPropList::getChunk", + "H5Pget_chunk returns negative chunk size"); } return( chunk_size ); } @@ -57,7 +59,8 @@ void DSetCreatPropList::setLayout(hid_t plist, H5D_layout_t layout ) const herr_t ret_value = H5Pset_layout( id, layout ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("DSetCreatPropList::setLayout", + "H5Pset_layout failed"); } } @@ -67,7 +70,8 @@ void DSetCreatPropList::setDeflate( int level ) const herr_t ret_value = H5Pset_deflate( id, level ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("DSetCreatPropList::setDeflate", + "H5Pset_deflate failed"); } } @@ -77,7 +81,8 @@ void DSetCreatPropList::setFillValue( DataType& fvalue_type, const void* value ) herr_t ret_value = H5Pset_fill_value( id, fvalue_type.getId(), value ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("DSetCreatPropList::setFillValue", + "H5Pset_fill_value failed"); } } @@ -87,7 +92,8 @@ void DSetCreatPropList::getFillValue( DataType& fvalue_type, void* value ) const herr_t ret_value = H5Pget_fill_value( id, fvalue_type.getId(), value ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("DSetCreatPropList::getFillValue", + "H5Pget_fill_value failed"); } } @@ -97,7 +103,8 @@ void DSetCreatPropList::setFilter( H5Z_filter_t filter, unsigned int flags, size herr_t ret_value = H5Pset_filter( id, filter, flags, cd_nelmts, cd_values ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("DSetCreatPropList::setFilter", + "H5Pset_filter failed"); } } @@ -107,7 +114,8 @@ int DSetCreatPropList::getNfilters() const int num_filters = H5Pget_nfilters( id ); if( num_filters < 0 ) { - throw PropListIException(); + throw PropListIException("DSetCreatPropList::getNfilters", + "H5Pget_nfilters returned negative number of filters"); } else return( num_filters ); @@ -117,10 +125,12 @@ int DSetCreatPropList::getNfilters() const H5Z_filter_t DSetCreatPropList::getFilter( int filter_number, unsigned int& flags, size_t& cd_nelmts, unsigned int* cd_values, size_t namelen, char name[] ) const { H5Z_filter_t filter; - filter = H5Pget_filter( id, filter_number, &flags, &cd_nelmts, cd_values, namelen, name ); + filter = H5Pget_filter( id, filter_number, &flags, &cd_nelmts, + cd_values, namelen, name ); if( filter == H5Z_FILTER_ERROR ) { - throw PropListIException(); + throw PropListIException("DSetCreatPropList::getFilter", + "H5Pget_filter returned H5Z_FILTER_ERROR"); } else return( filter ); @@ -132,7 +142,8 @@ void DSetCreatPropList::setExternal( const char* name, off_t offset, hsize_t siz herr_t ret_value = H5Pset_external( id, name, offset, size ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("DSetCreatPropList::setExternal", + "H5Pset_external failed"); } } @@ -142,7 +153,8 @@ int DSetCreatPropList::getExternalCount() const int num_ext_files = H5Pget_external_count( id ); if( num_ext_files < 0 ) { - throw PropListIException(); + throw PropListIException("DSetCreatPropList::getExternalCount", + "H5Pget_external_count returns negative number of external files"); } else return( num_ext_files ); @@ -154,7 +166,8 @@ void DSetCreatPropList::getExternal( int idx, size_t name_size, char* name, off_ herr_t ret_value = H5Pget_external( id, idx, name_size, name, &offset, &size ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("DSetCreatPropList::getExternal", + "H5Pget_external failed"); } } diff --git a/c++/src/H5DxferProp.cpp b/c++/src/H5DxferProp.cpp index 5792865..a3247d0 100644 --- a/c++/src/H5DxferProp.cpp +++ b/c++/src/H5DxferProp.cpp @@ -25,7 +25,8 @@ void DSetMemXferPropList::setBuffer( size_t size, void* tconv, void* bkg ) const herr_t ret_value = H5Pset_buffer( id, size, tconv, bkg ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("DSetMemXferPropList::setBuffer", + "H5Pset_buffer failed"); } } @@ -35,7 +36,8 @@ size_t DSetMemXferPropList::getBuffer( void** tconv, void** bkg ) const size_t buffer_size = H5Pget_buffer( id, tconv, bkg ); if( buffer_size == 0 ) { - throw PropListIException(); + throw PropListIException("DSetMemXferPropList::getBuffer", + "H5Pget_buffer returned 0 for buffer size - failure"); } return( buffer_size ); } @@ -46,7 +48,8 @@ void DSetMemXferPropList::setPreserve( bool status ) const herr_t ret_value = H5Pset_preserve( id, (hbool_t) status ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("DSetMemXferPropList::setPreserve", + "H5Pset_preserve failed"); } } @@ -60,7 +63,8 @@ bool DSetMemXferPropList::getPreserve() const return false; else { - throw PropListIException(); + throw PropListIException("DSetMemXferPropList::getPreserve", + "H5Pget_preserve returned negative value for status"); } } @@ -70,7 +74,8 @@ void DSetMemXferPropList::setHyperCache( bool cache, unsigned limit ) const herr_t ret_value = H5Pset_hyper_cache( id, cache, limit ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("DSetMemXferPropList::setHyperCache", + "H5Pset_hyper_cache failed"); } } @@ -81,7 +86,8 @@ void DSetMemXferPropList::getHyperCache( bool& cache, unsigned& limit ) const herr_t ret_value = H5Pget_hyper_cache( id, &temp_cache, &limit ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("DSetMemXferPropList::getHyperCache", + "H5Pget_hyper_cache failed"); } if( temp_cache > 0 ) cache = true; @@ -95,7 +101,8 @@ void DSetMemXferPropList::setBtreeRatios( double left, double middle, double rig herr_t ret_value = H5Pset_btree_ratios( id, left, middle, right ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("DSetMemXferPropList::setBtreeRatios", + "H5Pset_btree_ratios failed"); } } @@ -105,7 +112,8 @@ void DSetMemXferPropList::getBtreeRatios( double& left, double& middle, double& herr_t ret_value = H5Pget_btree_ratios( id, &left, &middle, &right ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("DSetMemXferPropList::getBtreeRatios", + "H5Pget_btree_ratios failed"); } } @@ -116,7 +124,8 @@ void DSetMemXferPropList::setVlenMemManager( H5MM_allocate_t alloc_func, void* a free_func, free_info ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("DSetMemXferPropList::setVlenMemManager", + "H5Pset_vlen_mem_manager failed"); } } @@ -128,7 +137,8 @@ void DSetMemXferPropList::setVlenMemManager() const //herr_t ret_value = H5Pset_vlen_mem_manager( id, NULL, NULL, NULL, NULL ); //if( ret_value < 0 ) //{ - //throw PropListIException(); + //throw PropListIException("DSetMemXferPropList::setVlenMemManager", + //"H5Pset_vlen_mem_manager failed"); //} } @@ -138,7 +148,8 @@ void DSetMemXferPropList::getVlenMemManager( H5MM_allocate_t& alloc_func, void** herr_t ret_value = H5Pget_vlen_mem_manager( id, &alloc_func, alloc_info, &free_func, free_info ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("DSetMemXferPropList::getVlenMemManager", + "H5Pget_vlen_mem_manager failed"); } } @@ -149,7 +160,8 @@ void DSetMemXferPropList::setXfer( H5D_transfer_t data_xfer_mode = H5D_XFER_INDE herr_t ret_value = H5Pset_xfer( ... ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("DSetMemXferPropList::setXfer", + "H5Pset_xfer failed"); } } @@ -158,10 +170,12 @@ void DSetMemXferPropList::setXfer( H5D_transfer_t data_xfer_mode = H5D_XFER_INDE H5D_transfer_t DSetMemXferPropList::getXfer() const { H5D_transfer_t xfer = H5Pget_xfer( id ); -// remove when done - find out what the value is for ?? +// BMR - need to find out what the value is for ?? when this function +// is supported if( xfer == ?? ) { - throw PropListIException(); + throw PropListIException("DSetMemXferPropList::getXfer", + "H5Pget_xfer failed"); } return( xfer ); } diff --git a/c++/src/H5EnumType.cpp b/c++/src/H5EnumType.cpp index 303bac5..5bf9ece 100644 --- a/c++/src/H5EnumType.cpp +++ b/c++/src/H5EnumType.cpp @@ -41,7 +41,7 @@ EnumType::EnumType( const DataSet& dataset ) : DataType() // If the datatype id is not valid, throw an exception if( id <= 0 ) { - throw DataSetIException("Getting datatype fails..."); + throw DataSetIException("EnumType constructor", "H5Dget_type failed"); } } @@ -54,7 +54,7 @@ EnumType::EnumType( const IntType& data_type ) : DataType() // If the datatype id is not valid, throw an exception if( id <= 0 ) { - throw DataSetIException("Creating enumeration datatype fails..."); + throw DataSetIException("EnumType constructor", "H5Tenum_create failed"); } } @@ -69,7 +69,7 @@ void EnumType::insert( const char* name, void *value ) const herr_t ret_value = H5Tenum_insert( id, name, value ); if( ret_value < 0 ) { - throw DataTypeIException(); + throw DataTypeIException("EnumType::insert", "H5Tenum_insert failed"); } } @@ -84,7 +84,7 @@ string EnumType::nameOf( void *value, size_t size ) const // If H5Tenum_nameof returns a negative value, raise an exception, if( ret_value < 0 ) { - throw DataTypeIException(); + throw DataTypeIException("EnumType::nameOf", "H5Tenum_nameof failed"); } // otherwise, create the string to hold the datatype name and return it string name = string( name_C ); @@ -104,7 +104,7 @@ void EnumType::valueOf( const char* name, void *value ) const herr_t ret_value = H5Tenum_valueof( id, name, value ); if( ret_value < 0 ) { - throw DataTypeIException(); + throw DataTypeIException("EnumType::valueOf", "H5Tenum_valueof failed"); } } @@ -116,7 +116,7 @@ void EnumType::getMemberValue( int memb_no, void *value ) const hid_t ret_value = H5Tget_member_value( id, memb_no, value ); if( ret_value < 0 ) { - throw DataTypeIException(); + throw DataTypeIException("EnumType::getMemberValue", "H5Tget_member_value failed"); } } diff --git a/c++/src/H5Exception.cpp b/c++/src/H5Exception.cpp index 86606db..3eeb2b8 100644 --- a/c++/src/H5Exception.cpp +++ b/c++/src/H5Exception.cpp @@ -6,33 +6,43 @@ #include "H5Include.h" #include <string> - -// Added this line for CC to work at this time. Will remove it when -// the problem is fixed. BMR - 10/30/00 - #include "H5Exception.h" #ifndef H5_NO_NAMESPACE namespace H5 { #endif -Exception::Exception() : detailMessage("") {} +// Default constructor +Exception::Exception() : detailMessage(""), funcName("") {} + +// Constructor taking only a detailed message as string object +//Exception::Exception(const string& message) : detailMessage(message) {} +// Constructor taking a function name and a detailed message as string objects +Exception::Exception(const string& func_name, const string& message) : detailMessage(message), funcName(func_name) {} + +// Constructor taking a detailed message as character string // digital alpha (gondolin) produces compilation error at static_cast<string> // so I replaced this constructor by the one below it //Exception::Exception( const char* message) : detailMessage(static_cast<string>(message)) {} - -Exception::Exception( const char* message) +//Exception::Exception(const char* message) +//{ + //detailMessage = string(message); +//} + +// Constructor taking a function name and a detailed message as character +// strings +Exception::Exception(const char* func_name, const char* message) { - detailMessage = string( message ); + detailMessage = string(message); + funcName = string(func_name); } -Exception::Exception( const string& message ) : detailMessage( message ) {} - // copy constructor Exception::Exception( const Exception& orig ) { detailMessage = orig.detailMessage; + funcName = orig.funcName; } // Returns the character string that describes an error specified by @@ -62,7 +72,7 @@ void Exception::setAutoPrint( H5E_auto_t func, void* client_data ) // the specified function. herr_t ret_value = H5Eset_auto( func, client_data ); if( ret_value < 0 ) - throw Exception( "Exception::setAutoPrint" ); + throw Exception( "Exception::setAutoPrint", "H5Eset_auto failed" ); } // Turns off the automatic error printing. @@ -72,7 +82,7 @@ void Exception::dontPrint() // off the automatic error printing. herr_t ret_value = H5Eset_auto( NULL, NULL ); if( ret_value < 0 ) - throw Exception( "Exception::dontPrint" ); + throw Exception( "Exception::dontPrint", "H5Eset_auto failed" ); } // Retrieves the current settings for the automatic error stack traversal @@ -83,7 +93,7 @@ void Exception::getAutoPrint( H5E_auto_t& func, void** client_data ) // the automatic error printing herr_t ret_value = H5Eget_auto( &func, client_data ); if( ret_value < 0 ) - throw Exception( "Exception::getAutoPrint" ); + throw Exception( "Exception::getAutoPrint", "H5Eget_auto failed" ); } // Clears the error stack for the current thread. @@ -92,7 +102,7 @@ void Exception::clearErrorStack() // calls the C API routine H5Eclear to clear the error stack herr_t ret_value = H5Eclear(); if( ret_value < 0 ) - throw Exception( "Exception::clearErrorStack" ); + throw Exception( "Exception::clearErrorStack", "H5Eclear failed" ); } // Walks the error stack for the current thread, calling the specified function. @@ -101,7 +111,7 @@ void Exception::walkErrorStack( H5E_direction_t direction, H5E_walk_t func, void // calls the C API routine H5Ewalk to walk the error stack herr_t ret_value = H5Ewalk( direction, func, client_data ); if( ret_value < 0 ) - throw Exception( "Exception::walkErrorStack" ); + throw Exception( "Exception::walkErrorStack", "H5Ewalk failed" ); } // Default error stack traversal callback function that prints error @@ -111,18 +121,28 @@ void Exception::walkDefErrorStack( int n, H5E_error_t& err_desc, void* client_da // calls the C API routine H5Ewalk_cb to walk the error stack herr_t ret_value = H5Ewalk_cb( n, &err_desc, client_data ); if( ret_value < 0 ) - throw Exception( "Exception::walkDefErrorStack" ); + throw Exception( "Exception::walkDefErrorStack", "H5Ewalk_cb failed" ); } // Returns the detailed message set at the time the exception is thrown -string Exception::getDetailMesg() const +string Exception::getDetailMsg() const { - return( detailMessage ); + return(detailMessage); } -const char* Exception::getCDetailMesg() const +const char* Exception::getCDetailMsg() const +{ + return(detailMessage.c_str()); +} + +// Returns the function name where the exception is thrown +string Exception::getFuncName() const +{ + return(funcName); +} +const char* Exception::getCFuncName() const { - return( detailMessage.c_str() ); + return(funcName.c_str()); } // Prints the error stack in a default manner. @@ -130,49 +150,59 @@ void Exception::printError( FILE* stream ) const { herr_t ret_value = H5Eprint( NULL ); // print to stderr if( ret_value < 0 ) - throw Exception( "Exception::printError" ); + throw Exception( "Exception::printError", "H5Eprint failed" ); } Exception::~Exception() {} FileIException::FileIException():Exception(){} -FileIException::FileIException( string message ): Exception( message ){} +FileIException::FileIException(const string& func_name, const string& message) : Exception(func_name, message) {} +FileIException::FileIException(const char* func_name, const char* message) : Exception(func_name, message) {} FileIException::~FileIException() {} GroupIException::GroupIException():Exception(){} -GroupIException::GroupIException( string message ): Exception( message ){} +GroupIException::GroupIException(const string& func_name, const string& message) : Exception(func_name, message) {} +GroupIException::GroupIException(const char* func_name, const char* message) : Exception(func_name, message) {} GroupIException::~GroupIException() {} DataSpaceIException::DataSpaceIException():Exception(){} -DataSpaceIException::DataSpaceIException( string message ): Exception( message ) {} +DataSpaceIException::DataSpaceIException(const string& func_name, const string& message) : Exception(func_name, message) {} +DataSpaceIException::DataSpaceIException(const char* func_name, const char* message) : Exception(func_name, message) {} DataSpaceIException::~DataSpaceIException() {} DataTypeIException::DataTypeIException():Exception(){} -DataTypeIException::DataTypeIException( string message ): Exception( message ) {} +DataTypeIException::DataTypeIException(const string& func_name, const string& message) : Exception(func_name, message) {} +DataTypeIException::DataTypeIException(const char* func_name, const char* message) : Exception(func_name, message) {} DataTypeIException::~DataTypeIException() {} PropListIException::PropListIException():Exception(){} -PropListIException::PropListIException( string message ): Exception( message ) {} +PropListIException::PropListIException(const string& func_name, const string& message) : Exception(func_name, message) {} +PropListIException::PropListIException(const char* func_name, const char* message) : Exception(func_name, message) {} PropListIException::~PropListIException() {} DataSetIException::DataSetIException():Exception(){} -DataSetIException::DataSetIException( string message ): Exception( message ) {} +DataSetIException::DataSetIException(const string& func_name, const string& message) : Exception(func_name, message) {} +DataSetIException::DataSetIException(const char* func_name, const char* message) : Exception(func_name, message) {} DataSetIException::~DataSetIException() {} AttributeIException::AttributeIException():Exception(){} -AttributeIException::AttributeIException( string message ): Exception( message ) {} +AttributeIException::AttributeIException(const string& func_name, const string& message) : Exception(func_name, message) {} +AttributeIException::AttributeIException(const char* func_name, const char* message) : Exception(func_name, message) {} AttributeIException::~AttributeIException() {} ReferenceException::ReferenceException():Exception(){} -ReferenceException::ReferenceException( string message ): Exception( message ) {} +ReferenceException::ReferenceException(const string& func_name, const string& message) : Exception(func_name, message) {} +ReferenceException::ReferenceException(const char* func_name, const char* message) : Exception(func_name, message) {} ReferenceException::~ReferenceException() {} LibraryIException::LibraryIException():Exception(){} -LibraryIException::LibraryIException( string message ): Exception( message ) {} +LibraryIException::LibraryIException(const string& func_name, const string& message) : Exception(func_name, message) {} +LibraryIException::LibraryIException(const char* func_name, const char* message) : Exception(func_name, message) {} LibraryIException::~LibraryIException() {} IdComponentException::IdComponentException(): Exception() {} -IdComponentException::IdComponentException( string message ): Exception( message ) {} +IdComponentException::IdComponentException(const string& func_name, const string& message) : Exception(func_name, message) {} +IdComponentException::IdComponentException(const char* func_name, const char* message) : Exception(func_name, message) {} IdComponentException::~IdComponentException() {} // The following are from Java API but not done here: diff --git a/c++/src/H5Exception.h b/c++/src/H5Exception.h index 0bc12ee..1256a8d 100644 --- a/c++/src/H5Exception.h +++ b/c++/src/H5Exception.h @@ -1,4 +1,3 @@ -// C++ informative line for the emacs editor: -*- C++ -*- #ifndef _H5Exception_H #define _H5Exception_H @@ -11,16 +10,16 @@ using namespace std; class Exception { public: - // Creates an exception with no message + // Default constructor Exception(); - // Creates an exception with a detailed message - Exception( const string& message ); - - Exception( const char* message); + // Creates an exception with a function name where the failure occurs + // and an optional detailed message + Exception( const string& func_name, const string& message = NULL); + Exception( const char* func_name, const char* message = NULL); // copy constructor - Exception( const Exception& orig ); + Exception( const Exception& orig); // Returns the character string that describes an error specified by // a major error number. @@ -31,18 +30,20 @@ class Exception { string getMinorString( H5E_minor_t minor_num ) const; // Returns the detailed message set at the time the exception is thrown - string getDetailMesg() const; - const char* getCDetailMesg() const; // C string of detailed message + string getDetailMsg() const; + const char* getCDetailMsg() const; // C string of detailed message + string getFuncName() const; // function name as a string object + const char* getCFuncName() const; // function name as a char string // Turns on the automatic error printing. - static void setAutoPrint( H5E_auto_t func, void* client_data ); + static void setAutoPrint( H5E_auto_t func, void* client_data); // Turns off the automatic error printing. static void dontPrint(); // Retrieves the current settings for the automatic error stack // traversal function and its data. - static void getAutoPrint( H5E_auto_t& func, void** client_data ); + static void getAutoPrint( H5E_auto_t& func, void** client_data); // Clears the error stack for the current thread. static void clearErrorStack(); @@ -50,12 +51,12 @@ class Exception { // Walks the error stack for the current thread, calling the // specified function. static void walkErrorStack( H5E_direction_t direction, - H5E_walk_t func, void* client_data ); + H5E_walk_t func, void* client_data); // Default error stack traversal callback function that prints // error messages to the specified output stream. static void walkDefErrorStack( int n, H5E_error_t& err_desc, - void* client_data ); + void* client_data); // Prints the error stack in a default manner. virtual void printError( FILE* stream = NULL ) const; @@ -65,75 +66,86 @@ class Exception { private: string detailMessage; + string funcName; }; class FileIException : public Exception { public: FileIException(); - FileIException( string message ); + FileIException( const string& func_name, const string& message = NULL); + FileIException( const char* func_name, const char* message = NULL); virtual ~FileIException(); }; class GroupIException : public Exception { public: GroupIException(); - GroupIException( string message ); + GroupIException( const string& func_name, const string& message=NULL); + GroupIException( const char* func_name, const char* message = NULL); virtual ~GroupIException(); }; class DataSpaceIException : public Exception { public: DataSpaceIException(); - DataSpaceIException( string message ); + DataSpaceIException(const string& func_name, const string& message=NULL); + DataSpaceIException(const char* func_name, const char* message = NULL); virtual ~DataSpaceIException(); }; class DataTypeIException : public Exception { public: DataTypeIException(); - DataTypeIException( string message ); + DataTypeIException(const string& func_name, const string& message = NULL); + DataTypeIException(const char* func_name, const char* message = NULL); virtual ~DataTypeIException(); }; class PropListIException : public Exception { public: PropListIException(); - PropListIException( string message ); + PropListIException(const string& func_name, const string& message=NULL); + PropListIException(const char* func_name, const char* message = NULL); virtual ~PropListIException(); }; class DataSetIException : public Exception { public: DataSetIException(); - DataSetIException( string message ); + DataSetIException(const string& func_name, const string& message=NULL); + DataSetIException(const char* func_name, const char* message = NULL); virtual ~DataSetIException(); }; class AttributeIException : public Exception { public: AttributeIException(); - AttributeIException( string message ); + AttributeIException(const string& func_name, const string& message=NULL); + AttributeIException(const char* func_name, const char* message = NULL); virtual ~AttributeIException(); }; class ReferenceException : public Exception { public: ReferenceException(); - ReferenceException( string message ); + ReferenceException(const string& func_name, const string& message=NULL); + ReferenceException(const char* func_name, const char* message = NULL); virtual ~ReferenceException(); }; class LibraryIException : public Exception { public: LibraryIException(); - LibraryIException( string message ); + LibraryIException(const string& func_name, const string& message=NULL); + LibraryIException(const char* func_name, const char* message = NULL); virtual ~LibraryIException(); }; class IdComponentException : public Exception { public: IdComponentException(); - IdComponentException( string message ); + IdComponentException(const string& func_name, const string& message=NULL); + IdComponentException(const char* func_name, const char* message = NULL); virtual ~IdComponentException(); }; diff --git a/c++/src/H5FaccProp.cpp b/c++/src/H5FaccProp.cpp index 7d76bcc..24e42c5 100644 --- a/c++/src/H5FaccProp.cpp +++ b/c++/src/H5FaccProp.cpp @@ -25,7 +25,7 @@ void FileAccPropList::setStdio() const herr_t ret_value = H5Pset_stdio( id ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("FileAccPropList::setStdio", "H5Pset_stdio failed"); } } @@ -43,7 +43,7 @@ H5F_driver_t FileAccPropList::getDriver() const H5F_driver_t driver = H5Pget_driver( id ); if( driver == H5F_LOW_ERROR ) { - throw PropListIException(); + throw PropListIException("FileAccPropList::getDriver", "H5Pget_driver failed"); } return( driver ); } @@ -53,7 +53,7 @@ void FileAccPropList::setSec2() const herr_t ret_value = H5Pset_sec2( id ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("FileAccPropList::setSec2", "H5Pset_sec2 failed"); } } @@ -71,7 +71,7 @@ void FileAccPropList::setCore( size_t increment ) const herr_t ret_value = H5Pset_core( id, increment ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("FileAccPropList::setCore", "H5Pset_core failed"); } } @@ -89,7 +89,7 @@ void FileAccPropList::setFamily( hsize_t memb_size, const FileAccPropList& memb_ herr_t ret_value = H5Pset_family( id, memb_size, memb_plist.getId() ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("FileAccPropList::setFamily", "H5Pset_family failed"); } } @@ -121,7 +121,7 @@ void FileAccPropList::setSplit( FileAccPropList& meta_plist, FileAccPropList& ra herr_t ret_value = H5Pset_split( id, meta_ext, meta_pid, raw_ext, raw_pid ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("FileAccPropList::setSplit", "H5Pset_split failed"); } } @@ -139,7 +139,7 @@ void FileAccPropList::getSplit( size_t meta_ext_size, string& meta_ext, FileAccP &meta_plist_id, raw_ext_size, raw_ext_C, &raw_plist_id ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("FileAccPropList::getSplit", "H5Pget_split failed"); } meta_plist.setId( meta_plist_id ); raw_plist.setId( raw_plist_id ); @@ -155,7 +155,7 @@ void FileAccPropList::setAlignment( hsize_t threshold, hsize_t alignment ) const herr_t ret_value = H5Pset_alignment( id, threshold, alignment ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("FileAccPropList::setAlignment", "H5Pset_alignment failed"); } } @@ -164,7 +164,7 @@ void FileAccPropList::getAlignment( hsize_t& threshold, hsize_t& alignment ) con herr_t ret_value = H5Pget_alignment( id, &threshold, &alignment ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("FileAccPropList::getAlignment", "H5Pget_alignment failed"); } } @@ -175,7 +175,7 @@ void FileAccPropList::setMpi( MPI_Comm comm, MPI_Info info ) const herr_t ret_value = H5Pset_mpi( id, comm, info ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("FileAccPropList::setMpi", "H5Pset_mpi failed"); } } @@ -194,7 +194,7 @@ void FileAccPropList::setCache( int mdc_nelmts, int rdcc_nelmts, size_t rdcc_nby herr_t ret_value = H5Pset_cache( id, mdc_nelmts, rdcc_nelmts, rdcc_nbytes, rdcc_w0 ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("FileAccPropList::setCache", "H5Pset_cache failed"); } } @@ -203,7 +203,7 @@ void FileAccPropList::getCache( int& mdc_nelmts, int& rdcc_nelmts, size_t& rdcc_ herr_t ret_value = H5Pget_cache( id, &mdc_nelmts, &rdcc_nelmts, &rdcc_nbytes, &rdcc_w0 ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("FileAccPropList::getCache", "H5Pget_cache failed"); } } @@ -212,7 +212,7 @@ void FileAccPropList::setGcReferences( unsigned gc_ref ) const herr_t ret_value = H5Pset_gc_references( id, gc_ref ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("FileAccPropList::setGcReferences", "H5Pset_gc_references failed"); } } @@ -224,7 +224,7 @@ unsigned FileAccPropList::getGcReferences() const herr_t ret_value = H5Pget_gc_references( id, &gc_ref ); if( ret_value < 0 ) { - throw PropListIException(); + throw PropListIException("FileAccPropList::getGcReferences", "H5Pget_gc_references failed"); } return( gc_ref ); } diff --git a/c++/src/H5FcreatProp.cpp b/c++/src/H5FcreatProp.cpp index 51f4773..d511595 100644 --- a/c++/src/H5FcreatProp.cpp +++ b/c++/src/H5FcreatProp.cpp @@ -25,7 +25,8 @@ void FileCreatPropList::getVersion( herr_t ret_value = H5Pget_version( id, &boot, &freelist, &stab, &shhdr ); if( ret_value < 0 ) { - throw PropListIException("FileCreatPropList constructor"); + throw PropListIException("FileCreatPropList::getVersion", + "H5Pget_version failed"); } } @@ -34,7 +35,8 @@ void FileCreatPropList::setUserblock( hsize_t size ) const herr_t ret_value = H5Pset_userblock( id, size); if( ret_value < 0 ) { - throw PropListIException("FileCreatPropList::setUserblock"); + throw PropListIException("FileCreatPropList::setUserblock", + "H5Pset_userblock failed"); } } @@ -44,7 +46,8 @@ hsize_t FileCreatPropList::getUserblock() const herr_t ret_value = H5Pget_userblock( id, &userblock_size ); if( ret_value < 0 ) { - throw PropListIException("FileCreatPropList::getUserblock"); + throw PropListIException("FileCreatPropList::getUserblock", + "H5Pget_userblock failed"); } return( userblock_size ); } @@ -54,7 +57,8 @@ void FileCreatPropList::setSizes( size_t sizeof_addr, size_t sizeof_size ) const herr_t ret_value = H5Pset_sizes( id, sizeof_addr, sizeof_size ); if( ret_value < 0 ) { - throw PropListIException("FileCreatPropList::setSizes"); + throw PropListIException("FileCreatPropList::setSizes", + "H5Pset_sizes failed"); } } @@ -63,7 +67,8 @@ void FileCreatPropList::getSizes( size_t& sizeof_addr, size_t& sizeof_size ) con herr_t ret_value = H5Pget_sizes( id, &sizeof_addr, &sizeof_size ); if( ret_value < 0 ) { - throw PropListIException("FileCreatPropList::getSizes"); + throw PropListIException("FileCreatPropList::getSizes", + "H5Pget_sizes failed"); } } @@ -72,7 +77,8 @@ void FileCreatPropList::setSymk( int ik, int lk ) const herr_t ret_value = H5Pset_sym_k( id, ik, lk ); if( ret_value < 0 ) { - throw PropListIException("FileCreatPropList::setSymk"); + throw PropListIException("FileCreatPropList::setSymk", + "H5Pset_sym_k failed"); } } @@ -81,7 +87,8 @@ void FileCreatPropList::getSymk( int& ik, int& lk ) const herr_t ret_value = H5Pget_sym_k( id, &ik, &lk ); if( ret_value < 0 ) { - throw PropListIException("FileCreatPropList::getSymk"); + throw PropListIException("FileCreatPropList::getSymk", + "H5Pget_sym_k failed"); } } @@ -90,7 +97,8 @@ void FileCreatPropList::setIstorek( int ik ) const herr_t ret_value = H5Pset_istore_k( id, ik ); if( ret_value < 0 ) { - throw PropListIException("FileCreatPropList::setIstorek"); + throw PropListIException("FileCreatPropList::setIstorek", + "H5Pset_istore_k failed"); } } int FileCreatPropList::getIstorek() const @@ -99,7 +107,8 @@ int FileCreatPropList::getIstorek() const herr_t ret_value = H5Pget_istore_k( id, &ik ); if( ret_value < 0 ) { - throw PropListIException("FileCreatPropList::getIstorek"); + throw PropListIException("FileCreatPropList::getIstorek", + "H5Pget_istore_k failed"); } return( ik ); } diff --git a/c++/src/H5File.cpp b/c++/src/H5File.cpp index a9058bd..9a668c4 100644 --- a/c++/src/H5File.cpp +++ b/c++/src/H5File.cpp @@ -38,26 +38,29 @@ H5File::H5File( const char* name, unsigned int flags, const FileCreatPropList& c // constructors taking a string or a char* void H5File::getFile( const char* name, unsigned int flags, const FileCreatPropList& create_plist, const FileAccPropList& access_plist ) { - // These bits only set for creation, so if any of them are set, - // create the file. - if( flags & (H5F_ACC_EXCL|H5F_ACC_TRUNC|H5F_ACC_DEBUG )) - { - hid_t create_plist_id = create_plist.getId(); - hid_t access_plist_id = access_plist.getId(); - id = H5Fcreate( name, flags, create_plist_id, access_plist_id ); - } - // Open the file if none of the bits above are set. - else - { - // use create_plist for access plist because of the default argument - hid_t access_plist_id = create_plist.getId(); - id = H5Fopen( name, flags, access_plist_id ); - } - - if( id <= 0 ) // throw an exception when open/create fail - { - throw FileIException( "H5File constructor" ); - } + // These bits only set for creation, so if any of them are set, + // create the file. + if( flags & (H5F_ACC_EXCL|H5F_ACC_TRUNC|H5F_ACC_DEBUG )) + { + hid_t create_plist_id = create_plist.getId(); + hid_t access_plist_id = access_plist.getId(); + id = H5Fcreate( name, flags, create_plist_id, access_plist_id ); + if( id <= 0 ) // throw an exception when open/create fail + { + throw FileIException("H5File constructor", "H5Fcreate failed"); + } + } + // Open the file if none of the bits above are set. + else + { + // use create_plist for access plist because of the default argument + hid_t access_plist_id = create_plist.getId(); + id = H5Fopen( name, flags, access_plist_id ); + if( id <= 0 ) // throw an exception when open/create fail + { + throw FileIException("H5File constructor", "H5Fopen failed"); + } + } } // Copy constructor: makes a copy of the original H5File object. @@ -79,7 +82,7 @@ bool H5File::isHdf5(const char* name ) return false; else // Raise exception when H5Fis_hdf5 returns a negative value { - throw FileIException( "H5File::isHdf5" ); + throw FileIException("H5File::isHdf5", "H5Fis_hdf5 returned negative value"); } } @@ -95,14 +98,18 @@ void H5File::reopen() { // reset the identifier of this H5File - send 'this' in so that // H5Fclose can be called appropriately - resetIdComponent( this ); + try { + resetIdComponent( this ); } + catch (Exception close_error) { // thrown by p_close + throw FileIException("H5File::reopen", close_error.getDetailMsg()); + } // call C routine to reopen the file - Note: not sure about this // does id need to be closed later? which id to be the parameter? id = H5Freopen( id ); if( id <= 0 ) // Raise exception when H5Freopen returns a neg value { - throw FileIException( "H5File::reopen" ); + throw FileIException("H5File::reopen", "H5Freopen failed"); } } @@ -120,7 +127,7 @@ FileCreatPropList H5File::getCreatePlist() const } else { - throw FileIException( "H5File::getCreatePlist" ); + throw FileIException("H5File::getCreatePlist", "H5Fget_create_plist failed"); } } @@ -138,7 +145,7 @@ FileAccPropList H5File::getAccessPlist() const } else // Raise an exception { - throw FileIException( "H5File::getAccessPlist" ); + throw FileIException("H5File::getAccessPlist", "H5Fget_access_plist failed"); } } @@ -148,14 +155,19 @@ void H5File::p_close() const herr_t ret_value = H5Fclose( id ); if( ret_value < 0 ) { - throw FileIException( "H5File::p_close" ); + throw FileIException(NULL, "H5Fclose failed"); } } -// Throw file exception -void H5File::throwException() const +// Throw file exception; used in CommonFG implementation so that proper +// exception can be thrown for file or group. The func_name is a member +// function of CommonFG and "H5File::" will be inserted to indicate the +// function called is an implementation of H5File +void H5File::throwException(const string& func_name, const string& msg) const { - throw FileIException(); + string full_name = func_name; + full_name.insert(0, "H5File::"); + throw FileIException(full_name, msg); } // The destructor of this instance calls IdComponent::reset to @@ -166,7 +178,11 @@ void H5File::throwException() const H5File::~H5File() { // The HDF5 file id will be closed properly - resetIdComponent( this ); + try { + resetIdComponent( this ); } + catch (Exception close_error) { // thrown by p_close + throw FileIException("H5File::~H5File", close_error.getDetailMsg()); + } } #ifndef H5_NO_NAMESPACE diff --git a/c++/src/H5File.h b/c++/src/H5File.h index b7c0d63..2defa2e 100644 --- a/c++/src/H5File.h +++ b/c++/src/H5File.h @@ -23,7 +23,8 @@ class H5File : public IdComponent, public CommonFG { virtual hid_t getLocId() const; // Throw file exception - virtual void throwException() const; + virtual void throwException(const string& func_name, const string& msg) const; + // Determines if a file, specified by its name, is in HDF5 format static bool isHdf5(const string& name ); diff --git a/c++/src/H5FloatType.cpp b/c++/src/H5FloatType.cpp index 34275f8..501d0e5 100644 --- a/c++/src/H5FloatType.cpp +++ b/c++/src/H5FloatType.cpp @@ -43,7 +43,7 @@ FloatType::FloatType( const DataSet& dataset ) : AtomType() if( id <= 0 ) { - throw DataSetIException(); + throw DataSetIException("FloatType constructor", "H5Dget_type failed"); } } @@ -53,7 +53,7 @@ void FloatType::getFields( size_t& spos, size_t& epos, size_t& esize, size_t& mp herr_t ret_value = H5Tget_fields( id, &spos, &epos, &esize, &mpos, &msize ); if( ret_value < 0 ) { - throw DataTypeIException(); + throw DataTypeIException("FloatType::getFields", "H5Tget_fields failed"); } } @@ -63,7 +63,7 @@ void FloatType::setFields( size_t spos, size_t epos, size_t esize, size_t mpos, herr_t ret_value = H5Tset_fields( id, spos, epos, esize, mpos, msize ); if( ret_value < 0 ) { - throw DataTypeIException(); + throw DataTypeIException("FloatType::setFields", "H5Tset_fields failed"); } } @@ -74,7 +74,7 @@ size_t FloatType::getEbias() const // Returns the bias if successful if( ebias == 0 ) { - throw DataTypeIException(); + throw DataTypeIException("FloatType::getEbias", "H5Tget_ebias failed - returned exponent bias as 0"); } return( ebias ); } @@ -85,7 +85,7 @@ void FloatType::setEbias( size_t ebias ) const herr_t ret_value = H5Tset_ebias( id, ebias ); if( ret_value < 0 ) { - throw DataTypeIException(); + throw DataTypeIException("FloatType::setEbias", "H5Tset_ebias failed"); } } @@ -96,7 +96,7 @@ H5T_norm_t FloatType::getNorm( string& norm_string ) const // Returns a valid normalization type if successful if( norm == H5T_NORM_ERROR ) { - throw DataTypeIException(); + throw DataTypeIException("FloatType::getNorm", "H5Tget_norm failed - returned H5T_NORM_ERROR"); } if( norm == H5T_NORM_IMPLIED ) norm_string = "H5T_NORM_IMPLIED (0)"; @@ -113,7 +113,7 @@ void FloatType::setNorm( H5T_norm_t norm ) const herr_t ret_value = H5Tset_norm( id, norm ); if( ret_value < 0 ) { - throw DataTypeIException(); + throw DataTypeIException("FloatType::setNorm", "H5Tset_norm failed"); } } @@ -124,7 +124,7 @@ H5T_pad_t FloatType::getInpad( string& pad_string ) const // Returns a valid padding type if successful if( pad_type == H5T_PAD_ERROR ) { - throw DataTypeIException(); + throw DataTypeIException("FloatType::getInpad", "H5Tget_inpad failed - returned H5T_PAD_ERROR"); } if( pad_type == H5T_PAD_ZERO ) pad_string = "H5T_PAD_ZERO (0)"; @@ -141,7 +141,7 @@ void FloatType::setInpad( H5T_pad_t inpad ) const herr_t ret_value = H5Tset_inpad( id, inpad ); if( ret_value < 0 ) { - throw DataTypeIException(); + throw DataTypeIException("FloatType::setInpad", "H5Tset_inpad failed"); } } diff --git a/c++/src/H5Group.cpp b/c++/src/H5Group.cpp index c0ae1d3..52fb816 100644 --- a/c++/src/H5Group.cpp +++ b/c++/src/H5Group.cpp @@ -51,7 +51,7 @@ Group::Group( const hid_t group_id ) : H5Object( group_id ) {} //return( ret_value ); //else // raise exception when H5Aiterate returns a negative value //{ - //throw GroupIException(); + //throw GroupIException("Group::iterateElems", "H5Giterate failed"); //} //} @@ -61,14 +61,16 @@ void Group::p_close() const herr_t ret_value = H5Gclose( id ); if( ret_value < 0 ) { - throw GroupIException(); + throw GroupIException(NULL, "H5Gclose failed"); } } // Throw file exception -void Group::throwException() const +void Group::throwException(const string& func_name, const string& msg) const { - throw GroupIException(); + string full_name = func_name; + full_name.insert(0, "Group::"); + throw GroupIException(full_name, msg); } // The destructor of this instance calls IdComponent::reset to @@ -79,7 +81,12 @@ void Group::throwException() const Group::~Group() { // The group id will be closed properly - resetIdComponent( this ); + try { + resetIdComponent( this ); } + catch (Exception close_error) { // thrown by p_close + throw GroupIException("Group::~Group", close_error.getDetailMsg()); + } + } #ifndef H5_NO_NAMESPACE diff --git a/c++/src/H5Group.h b/c++/src/H5Group.h index c0a7a03..3a0ee4f 100644 --- a/c++/src/H5Group.h +++ b/c++/src/H5Group.h @@ -18,7 +18,8 @@ class Group : public H5Object, public CommonFG { virtual hid_t getLocId() const; // Throw group exception - virtual void throwException() const; + virtual void throwException(const string& func_name, const string& msg) const; + // Used by the API to appropriately close a group void p_close() const; diff --git a/c++/src/H5IdComponent.cpp b/c++/src/H5IdComponent.cpp index 60ddadb..d7ba7c4 100644 --- a/c++/src/H5IdComponent.cpp +++ b/c++/src/H5IdComponent.cpp @@ -63,7 +63,11 @@ IdComponent& IdComponent::operator=( const IdComponent& rhs ) { // reset the identifier of this object - resetIdComponent will call the // appropriate H5xclose to close the id - resetIdComponent( this ); + try { + resetIdComponent( this ); } + catch (Exception close_error) { // thrown by p_close + throw IdComponentException("IdComponent::operator=", close_error.getDetailMsg()); + } // copy the data members from the rhs object id = rhs.id; @@ -85,7 +89,11 @@ IdComponent& IdComponent::operator=( const IdComponent& rhs ) void IdComponent::setId( hid_t new_id ) { // reset the identifier of this object, call appropriate H5Xclose - resetIdComponent( this ); + try { + resetIdComponent( this ); } + catch (Exception close_error) { // thrown by p_close + throw IdComponentException("IdComponent::setId", close_error.getDetailMsg()); + } id = new_id; diff --git a/c++/src/H5IntType.cpp b/c++/src/H5IntType.cpp index bc1e1bc..c97daeb 100644 --- a/c++/src/H5IntType.cpp +++ b/c++/src/H5IntType.cpp @@ -35,7 +35,7 @@ IntType::IntType( const PredType& pred_type ) : AtomType() // Creates a integer datatype using an existing id IntType::IntType( const hid_t existing_id ) : AtomType( existing_id ) {} -// Gets the integer datatype of the specified dataset - will reimplement +// Gets the integer datatype of the specified dataset - will reimplement -BMR IntType::IntType( const DataSet& dataset ) : AtomType() { // Calls C function H5Dget_type to get the id of the datatype @@ -43,7 +43,7 @@ IntType::IntType( const DataSet& dataset ) : AtomType() if( id <= 0 ) { - throw DataSetIException(); + throw DataSetIException("IntType constructor", "H5Dget_type failed"); } } @@ -54,7 +54,8 @@ H5T_sign_t IntType::getSign() const // Returns a valid sign type if successful if( type_sign == H5T_SGN_ERROR ) { - throw DataTypeIException(); + throw DataTypeIException("IntType::getSign", + "H5Tget_sign failed - returned H5T_SGN_ERROR for the sign type"); } return( type_sign ); } @@ -66,7 +67,7 @@ void IntType::setSign( H5T_sign_t sign ) const herr_t ret_value = H5Tset_sign( id, sign ); if( ret_value < 0 ) { - throw DataTypeIException(); + throw DataTypeIException("IntType::setSign", "H5Tset_sign failed"); } } diff --git a/c++/src/H5Library.cpp b/c++/src/H5Library.cpp index ffce037..44f94b4 100644 --- a/c++/src/H5Library.cpp +++ b/c++/src/H5Library.cpp @@ -17,7 +17,7 @@ void H5Library::open() herr_t ret_value = H5open(); if( ret_value < 0 ) { - throw LibraryIException(); + throw LibraryIException("H5Library::open", "H5open failed"); } } @@ -27,7 +27,7 @@ void H5Library::close() herr_t ret_value = H5close(); if( ret_value < 0 ) { - throw LibraryIException(); + throw LibraryIException("H5Library::close", "H5close failed"); } } @@ -37,7 +37,7 @@ void H5Library::dontAtExit() herr_t ret_value = H5dont_atexit(); if( ret_value < 0 ) { - throw LibraryIException(); + throw LibraryIException("H5Library::dontAtExit", "H5dont_atexit failed"); } } @@ -47,7 +47,7 @@ void H5Library::getLibVersion( unsigned& majnum, unsigned& minnum, unsigned& rel herr_t ret_value = H5get_libversion( &majnum, &minnum, &relnum ); if( ret_value < 0 ) { - throw LibraryIException(); + throw LibraryIException("H5Library::getLibVersion", "H5get_libversion failed"); } } @@ -58,7 +58,7 @@ void H5Library::checkVersion( unsigned majnum, unsigned minnum, unsigned relnum herr_t ret_value = H5check_version( majnum, minnum, relnum ); if( ret_value < 0 ) { - throw LibraryIException(); + throw LibraryIException("H5Library::checkVersion", "H5check_version failed"); } } diff --git a/c++/src/H5Object.cpp b/c++/src/H5Object.cpp index a692d0d..6ea4459 100644 --- a/c++/src/H5Object.cpp +++ b/c++/src/H5Object.cpp @@ -57,7 +57,7 @@ Attribute H5Object::createAttribute( const char* name, const DataType& data_type } else { - throw AttributeIException(); + throw AttributeIException("H5Object::createAttribute", "H5Acreate failed"); } } @@ -78,7 +78,7 @@ Attribute H5Object::openAttribute( const char* name ) const } else { - throw AttributeIException(); + throw AttributeIException("H5Object::openAttribute", "H5Aopen_name failed"); } } @@ -99,7 +99,7 @@ Attribute H5Object::openAttribute( const unsigned int idx ) const } else { - throw AttributeIException(); + throw AttributeIException("H5Object::openAttribute", "H5Aopen_idx failed"); } } @@ -122,7 +122,7 @@ int H5Object::iterateAttrs( attr_operator_t user_op, unsigned * idx, void *op_da return( ret_value ); else // raise exception when H5Aiterate returns a negative value { - throw AttributeIException(); + throw AttributeIException("H5Object::iterateAttrs", "H5Aiterate failed"); } } @@ -132,7 +132,8 @@ int H5Object::getNumAttrs() const int num_attrs = H5Aget_num_attrs( id ); if( num_attrs < 0 ) { - throw AttributeIException(); + throw AttributeIException("H5Object::getNumAttrs", + "H5Aget_num_attrs failed - returned negative number of attributes"); } else return( num_attrs ); @@ -144,7 +145,7 @@ void H5Object::removeAttr( const char* name ) const herr_t ret_value = H5Adelete( id, name ); if( ret_value < 0 ) { - throw AttributeIException(); + throw AttributeIException("H5Object::removeAttr", "H5Adelete failed"); } } void H5Object::removeAttr( const string& name ) const @@ -158,7 +159,7 @@ void H5Object::flush(H5F_scope_t scope ) const herr_t ret_value = H5Fflush( id, scope ); if( ret_value < 0 ) { - throw FileIException(); + throw FileIException("H5Object::flush", "H5Fflush failed"); } } diff --git a/c++/src/H5PredType.cpp b/c++/src/H5PredType.cpp index 0ba8602..3f32f4b 100644 --- a/c++/src/H5PredType.cpp +++ b/c++/src/H5PredType.cpp @@ -171,7 +171,7 @@ const PredType PredType::NATIVE_UINT_FAST64( H5T_NATIVE_UINT_FAST64 ); // throw an DataTypeIException if invoked. void PredType::commit( H5Object& loc, const char* name ) { - throw DataTypeIException( "Attempting to commit a predefined datatype. This operation is invalid" ); + throw DataTypeIException("PredType::commit", "Attempting to commit a predefined datatype. This operation is invalid" ); } void PredType::commit( H5Object& loc, const string& name ) @@ -181,7 +181,7 @@ void PredType::commit( H5Object& loc, const string& name ) bool PredType::committed() { - throw DataTypeIException( "Error: Attempting to check for commit status on a predefined datatype." ); + throw DataTypeIException("PredType::committed", "Error: Attempting to check for commit status on a predefined datatype." ); return (-1); } diff --git a/c++/src/H5PropList.cpp b/c++/src/H5PropList.cpp index ad9c8ca..8609b60 100644 --- a/c++/src/H5PropList.cpp +++ b/c++/src/H5PropList.cpp @@ -24,7 +24,7 @@ PropList::PropList( H5P_class_t type ) : IdComponent( 0 ) id = H5Pcreate(type ); if( id <= 0 ) { - throw PropListIException(); + throw PropListIException("PropList constructor", "H5Pcreate failed"); } } @@ -46,7 +46,11 @@ void PropList::copy( const PropList& like_plist ) { // reset the identifier of this PropList - send 'this' in so that // H5Pclose can be called appropriately - resetIdComponent( this ); + try { + resetIdComponent( this ); } + catch (Exception close_error) { // thrown by p_close + throw PropListIException("PropList::copy", close_error.getDetailMsg()); + } // call C routine to copy the property list id = H5Pcopy( like_plist.getId() ); @@ -56,7 +60,7 @@ void PropList::copy( const PropList& like_plist ) if( id <= 0 ) { - throw PropListIException(); + throw PropListIException("PropList::copy", "H5Pcopy failed"); } } @@ -68,7 +72,7 @@ void PropList::p_close() const herr_t ret_value = H5Pclose( id ); if( ret_value < 0 ) { - throw PropListIException("PropList::p_close: unable to close the property list. Please report this bug to HDF." ); + throw PropListIException(NULL, "H5Pclose failed" ); } } } @@ -79,7 +83,8 @@ H5P_class_t PropList::getClass() const H5P_class_t plist_class = H5Pget_class( id ); if( plist_class == H5P_NO_CLASS ) { - throw PropListIException(); + throw PropListIException("PropList::getClass", + "H5Pget_class failed - returned H5P_NO_CLASS"); } return( plist_class ); } @@ -89,7 +94,11 @@ H5P_class_t PropList::getClass() const PropList::~PropList() { // The property list id will be closed properly - resetIdComponent( this ); + try { + resetIdComponent( this ); } + catch (Exception close_error) { // thrown by p_close + throw PropListIException("PropList::~PropList", close_error.getDetailMsg()); + } } #ifndef H5_NO_NAMESPACE diff --git a/c++/src/H5StrType.cpp b/c++/src/H5StrType.cpp index 51840db..7499b8e 100644 --- a/c++/src/H5StrType.cpp +++ b/c++/src/H5StrType.cpp @@ -35,7 +35,7 @@ StrType::StrType( const hid_t existing_id ) : AtomType( existing_id ) {} // Copy constructor: makes copy of the original StrType object StrType::StrType( const StrType& original ) : AtomType ( original ) {} -// Gets the string datatype of the specified dataset - will reimplement +// Gets the string datatype of the specified dataset - will reimplement - BMR StrType::StrType( const DataSet& dataset ) : AtomType () { // Calls C function H5Dget_type to get the id of the datatype @@ -43,7 +43,7 @@ StrType::StrType( const DataSet& dataset ) : AtomType () if( id <= 0 ) { - throw DataSetIException(); + throw DataSetIException("StrType constructor", "H5Dget_type failed"); } } @@ -55,7 +55,7 @@ H5T_cset_t StrType::getCset() const // Returns a valid character set type if successful if( cset == H5T_CSET_ERROR ) { - throw DataTypeIException(); + throw DataTypeIException("StrType::getCset", "H5Tget_cset failed"); } return( cset ); } @@ -67,7 +67,7 @@ void StrType::setCset( H5T_cset_t cset ) const if( ret_value < 0 ) { - throw DataTypeIException(); + throw DataTypeIException("StrType::setCset", "H5Tset_cset failed"); } } @@ -79,7 +79,8 @@ H5T_str_t StrType::getStrpad() const // Returns a valid string padding type if successful if( strpad == H5T_STR_ERROR ) { - throw DataTypeIException(); + throw DataTypeIException("StrType::getStrpad", + "H5Tget_strpad failed - returned H5T_STR_ERROR"); } return( strpad ); } @@ -91,7 +92,7 @@ void StrType::setStrpad( H5T_str_t strpad ) const if( ret_value < 0 ) { - throw DataTypeIException(); + throw DataTypeIException("StrType::setStrpad", "H5Tset_strpad failed"); } } |