diff options
author | Binh-Minh Ribler <bmribler@hdfgroup.org> | 2018-05-10 22:34:16 (GMT) |
---|---|---|
committer | Binh-Minh Ribler <bmribler@hdfgroup.org> | 2018-05-10 22:34:16 (GMT) |
commit | 731737845c15958cbe1ceb9141cbaf9e4acf4813 (patch) | |
tree | 8c64f2e7a9340125b14b751c0231d55c88135785 | |
parent | c470e6bcd60ee20afd19f16ba20e63b8b9a225f6 (diff) | |
parent | 5e4bc6df758b1dffad3583391e51e3c71bb91501 (diff) | |
download | hdf5-731737845c15958cbe1ceb9141cbaf9e4acf4813.zip hdf5-731737845c15958cbe1ceb9141cbaf9e4acf4813.tar.gz hdf5-731737845c15958cbe1ceb9141cbaf9e4acf4813.tar.bz2 |
Merge pull request #1051 in HDFFV/hdf5 from ~BMRIBLER/hdf5_1_8_bmr:hdf5_1_8 to hdf5_1_8
Improvement regarding to Exception hierarchy and throwException.
* commit '5e4bc6df758b1dffad3583391e51e3c71bb91501':
C++ API improvement Description: - Reorganized some exception classes to reflect the HDF5 object hierarchy and provide extendibility. DataSetIException -> LocationException -> Exception DataTypeIException -> LocationException -> Exception GroupIException -> LocationException -> Exception AttributeIException -> LocationException -> Exception FileIException -> GroupIException -> LocationException -> Exception - Added throwException() to these subclasses and use it in H5Location and H5Object member functions to throw an exception that is specific to the object that invokes the member function. Applications that catch the base exception can continue to do the same. - Many cleanup for inconsistencies in comments/headers. Platforms tested: Linux/64 (jelly) Linux/64 (platypus) Darwin (osx1010test)
-rw-r--r-- | c++/src/H5AcreatProp.cpp | 12 | ||||
-rw-r--r-- | c++/src/H5Attribute.cpp | 31 | ||||
-rw-r--r-- | c++/src/H5Attribute.h | 6 | ||||
-rw-r--r-- | c++/src/H5CompType.cpp | 10 | ||||
-rw-r--r-- | c++/src/H5DataSet.cpp | 13 | ||||
-rw-r--r-- | c++/src/H5DataSet.h | 3 | ||||
-rw-r--r-- | c++/src/H5DataType.cpp | 13 | ||||
-rw-r--r-- | c++/src/H5DataType.h | 3 | ||||
-rw-r--r-- | c++/src/H5DxferProp.cpp | 2 | ||||
-rw-r--r-- | c++/src/H5Exception.cpp | 88 | ||||
-rw-r--r-- | c++/src/H5Exception.h | 30 | ||||
-rw-r--r-- | c++/src/H5File.cpp | 14 | ||||
-rw-r--r-- | c++/src/H5Group.cpp | 14 | ||||
-rw-r--r-- | c++/src/H5IdComponent.cpp | 8 | ||||
-rw-r--r-- | c++/src/H5IdComponent.h | 4 | ||||
-rw-r--r-- | c++/src/H5LaccProp.cpp | 4 | ||||
-rw-r--r-- | c++/src/H5LaccProp.h | 3 | ||||
-rw-r--r-- | c++/src/H5LcreatProp.cpp | 12 | ||||
-rw-r--r-- | c++/src/H5Location.cpp | 194 | ||||
-rw-r--r-- | c++/src/H5Object.cpp | 24 | ||||
-rw-r--r-- | c++/src/H5Object.h | 6 | ||||
-rw-r--r-- | c++/src/H5StrcreatProp.cpp | 8 | ||||
-rw-r--r-- | c++/test/dsets.cpp | 19 | ||||
-rw-r--r-- | c++/test/tattr.cpp | 12 | ||||
-rw-r--r-- | c++/test/tfile.cpp | 14 | ||||
-rw-r--r-- | c++/test/tlinks.cpp | 20 | ||||
-rw-r--r-- | c++/test/tobject.cpp | 45 |
27 files changed, 365 insertions, 247 deletions
diff --git a/c++/src/H5AcreatProp.cpp b/c++/src/H5AcreatProp.cpp index 29886d8..825d230 100644 --- a/c++/src/H5AcreatProp.cpp +++ b/c++/src/H5AcreatProp.cpp @@ -39,7 +39,7 @@ AttrCreatPropList* AttrCreatPropList::DEFAULT_ = 0; // If AttrCreatPropList::DEFAULT_ already points to an allocated // object, throw a PropListIException. This scenario should not // happen. -// May, 2018 +// May 2018 //-------------------------------------------------------------------------- AttrCreatPropList* AttrCreatPropList::getConstant() { @@ -65,7 +65,7 @@ AttrCreatPropList* AttrCreatPropList::getConstant() // Purpose: Deletes the constant object that AttrCreatPropList::DEFAULT_ // points to. // exception H5::PropListIException -// May, 2018 +// May 2018 //-------------------------------------------------------------------------- void AttrCreatPropList::deleteConstants() { @@ -83,7 +83,7 @@ const AttrCreatPropList& AttrCreatPropList::DEFAULT = *getConstant(); //-------------------------------------------------------------------------- // Function: Default Constructor ///\brief Creates a file access property list -// May, 2018 +// May 2018 //-------------------------------------------------------------------------- AttrCreatPropList::AttrCreatPropList() : StrCreatPropList(H5P_ATTRIBUTE_CREATE) {} @@ -91,7 +91,7 @@ AttrCreatPropList::AttrCreatPropList() : StrCreatPropList(H5P_ATTRIBUTE_CREATE) // Function: AttrCreatPropList copy constructor ///\brief Copy constructor: same HDF5 object as \a original ///\param original - IN: AttrCreatPropList instance to copy -// May, 2018 +// May 2018 //-------------------------------------------------------------------------- AttrCreatPropList::AttrCreatPropList(const AttrCreatPropList& original) : StrCreatPropList(original) {} @@ -99,14 +99,14 @@ AttrCreatPropList::AttrCreatPropList(const AttrCreatPropList& original) : StrCre // Function: AttrCreatPropList overloaded constructor ///\brief Creates a file access property list using the id of an /// existing one. -// May, 2018 +// May 2018 //-------------------------------------------------------------------------- AttrCreatPropList::AttrCreatPropList(const hid_t plist_id) : StrCreatPropList(plist_id) {} //-------------------------------------------------------------------------- // Function: AttrCreatPropList destructor ///\brief Noop destructor -// May, 2018 +// May 2018 //-------------------------------------------------------------------------- AttrCreatPropList::~AttrCreatPropList() {} diff --git a/c++/src/H5Attribute.cpp b/c++/src/H5Attribute.cpp index 3733736..739cda7 100644 --- a/c++/src/H5Attribute.cpp +++ b/c++/src/H5Attribute.cpp @@ -278,23 +278,6 @@ DataSpace Attribute::getSpace() const } //-------------------------------------------------------------------------- -// Function: Attribute::getFileName -///\brief Gets the name of the file, in which this attribute belongs. -///\return File name -///\exception H5::IdComponentException -// Programmer Binh-Minh Ribler - Jul, 2004 -//-------------------------------------------------------------------------- -H5std_string Attribute::getFileName() const -{ - try { - return(p_get_file_name()); - } - catch (IdComponentException& E) { - throw FileIException("Attribute::getFileName", E.getDetailMsg()); - } -} - -//-------------------------------------------------------------------------- // Function: Attribute::getName ///\brief Gets the name of this attribute, returning its length. ///\param attr_name - OUT: Buffer for the name string as char* @@ -633,6 +616,20 @@ void Attribute::p_setId(const hid_t new_id) // reset object's id to the given id id = new_id; } + +//-------------------------------------------------------------------------- +// Function: Attribute::throwException +///\brief Throws H5::AttributeIException. +///\param func_name - Name of the function where failure occurs +///\param msg - Message describing the failure +///\exception H5::AttributeIException +// May 2018 +//-------------------------------------------------------------------------- +void Attribute::throwException(const H5std_string& func_name, const H5std_string& msg) const +{ + throw AttributeIException(inMemFunc(func_name.c_str()), msg); +} + #endif // DOXYGEN_SHOULD_SKIP_THIS //-------------------------------------------------------------------------- diff --git a/c++/src/H5Attribute.h b/c++/src/H5Attribute.h index 98883e2..9ac21b5 100644 --- a/c++/src/H5Attribute.h +++ b/c++/src/H5Attribute.h @@ -41,9 +41,6 @@ class H5_DLLCPP Attribute : public AbstractDs, public H5Location { // Closes this attribute. virtual void close(); - // Gets the name of the file, in which this attribute belongs. - H5std_string getFileName() const; - // Gets the name of this attribute. ssize_t getName(char* attr_name, size_t buf_size = 0) const; H5std_string getName(size_t len) const; @@ -80,6 +77,9 @@ class H5_DLLCPP Attribute : public AbstractDs, public H5Location { // Gets the attribute id. virtual hid_t getId() const; + // Throw group exception. + virtual void throwException(const H5std_string& func_name, const H5std_string& msg) const; + // Destructor: properly terminates access to this attribute. virtual ~Attribute(); diff --git a/c++/src/H5CompType.cpp b/c++/src/H5CompType.cpp index 9527037..903a7c4 100644 --- a/c++/src/H5CompType.cpp +++ b/c++/src/H5CompType.cpp @@ -191,7 +191,7 @@ H5std_string CompType::getMemberName(unsigned member_num) const /// Members are stored in no particular order with numbers 0 /// through N-1, where N is the value returned by the member /// function \c CompType::getNmembers. -// May 16, 2002 +// May 2002 //-------------------------------------------------------------------------- int CompType::getMemberIndex(const char* name) const { @@ -216,7 +216,7 @@ int CompType::getMemberIndex(const char* name) const /// Members are stored in no particular order with numbers 0 /// through N-1, where N is the value returned by the member /// function \c CompType::getNmembers. -// Apr 18, 2018 +// Apr 2018 //-------------------------------------------------------------------------- int CompType::getMemberIndex(const H5std_string& name) const { @@ -311,7 +311,7 @@ DataType CompType::getMemberDataType(unsigned member_num) const ///\param member_num - IN: Zero-based index of the member ///\return ArrayType instance ///\exception H5::DataTypeIException -// Jul, 2005 +// Jul 2005 //-------------------------------------------------------------------------- ArrayType CompType::getMemberArrayType(unsigned member_num) const { @@ -437,7 +437,7 @@ StrType CompType::getMemberStrType(unsigned member_num) const ///\param member_num - IN: Zero-based index of the member ///\return VarLenType instance ///\exception H5::DataTypeIException -// Jul, 2005 +// Jul 2005 //-------------------------------------------------------------------------- VarLenType CompType::getMemberVarLenType(unsigned member_num) const { @@ -533,7 +533,7 @@ void CompType::pack() const ///\exception H5::DataTypeIException // Note // H5Tset_size works on atom datatypes and compound datatypes only -// 2014 +// March 2014 //-------------------------------------------------------------------------- void CompType::setSize(size_t size) const { diff --git a/c++/src/H5DataSet.cpp b/c++/src/H5DataSet.cpp index 14dd607..1dce28e 100644 --- a/c++/src/H5DataSet.cpp +++ b/c++/src/H5DataSet.cpp @@ -826,6 +826,19 @@ void DataSet::close() } //-------------------------------------------------------------------------- +// Function: DataSet::throwException +///\brief Throws H5::DataSetIException. +///\param func_name - Name of the function where failure occurs +///\param msg - Message describing the failure +///\exception H5::DataSetIException +// May 2018 +//-------------------------------------------------------------------------- +void DataSet::throwException(const H5std_string& func_name, const H5std_string& msg) const +{ + throw DataSetIException(inMemFunc(func_name.c_str()), msg); +} + +//-------------------------------------------------------------------------- // Function: DataSet destructor ///\brief Properly terminates access to this dataset. // Programmer Binh-Minh Ribler - 2000 diff --git a/c++/src/H5DataSet.h b/c++/src/H5DataSet.h index 09aab08..f0178f4 100644 --- a/c++/src/H5DataSet.h +++ b/c++/src/H5DataSet.h @@ -85,6 +85,9 @@ class H5_DLLCPP DataSet : public H5Object, public AbstractDs { ///\brief Returns this class name. virtual H5std_string fromClass () const { return("DataSet"); } + // Throw DataSetIException. + virtual void throwException(const H5std_string& func_name, const H5std_string& msg) const; + // Creates a dataset by way of dereference. DataSet(const H5Location& loc, const void* ref, H5R_type_t ref_type = H5R_OBJECT); DataSet(const Attribute& attr, const void* ref, H5R_type_t ref_type = H5R_OBJECT); diff --git a/c++/src/H5DataType.cpp b/c++/src/H5DataType.cpp index 7b385d2..dc9b422 100644 --- a/c++/src/H5DataType.cpp +++ b/c++/src/H5DataType.cpp @@ -924,6 +924,19 @@ void DataType::close() } //-------------------------------------------------------------------------- +// Function: DataType::throwException +///\brief Throws H5::DataTypeIException. +///\param func_name - Name of the function where failure occurs +///\param msg - Message describing the failure +///\exception H5::DataTypeIException +// May 2018 +//-------------------------------------------------------------------------- +void DataType::throwException(const H5std_string& func_name, const H5std_string& msg) const +{ + throw DataTypeIException(inMemFunc(func_name.c_str()), msg); +} + +//-------------------------------------------------------------------------- // Function: DataType destructor ///\brief Properly terminates access to this datatype. // Programmer Binh-Minh Ribler - 2000 diff --git a/c++/src/H5DataType.h b/c++/src/H5DataType.h index 29cc990..efb0c14 100644 --- a/c++/src/H5DataType.h +++ b/c++/src/H5DataType.h @@ -122,6 +122,9 @@ class H5_DLLCPP DataType : public H5Object { ///\brief Returns this class name. virtual H5std_string fromClass () const { return("DataType"); } + // Throw DataTypeIException. + virtual void throwException(const H5std_string& func_name, const H5std_string& msg) const; + // Creates a copy of an existing DataType using its id DataType(const hid_t type_id); diff --git a/c++/src/H5DxferProp.cpp b/c++/src/H5DxferProp.cpp index da66ec6..f303e95 100644 --- a/c++/src/H5DxferProp.cpp +++ b/c++/src/H5DxferProp.cpp @@ -92,7 +92,7 @@ DSetMemXferPropList::DSetMemXferPropList() : PropList(H5P_DATASET_XFER) {} // Function DSetMemXferPropList constructor ///\brief Creates a dataset transfer property list with transform /// expression. -// Programmer: Binh-Minh Ribler - 2000 +// March 2014 //-------------------------------------------------------------------------- DSetMemXferPropList::DSetMemXferPropList(const char* exp) : PropList(H5P_DATASET_XFER) { diff --git a/c++/src/H5Exception.cpp b/c++/src/H5Exception.cpp index 0bb15bc..e5cc7b2 100644 --- a/c++/src/H5Exception.cpp +++ b/c++/src/H5Exception.cpp @@ -331,27 +331,27 @@ void Exception::printError(FILE* stream) const Exception::~Exception() throw() {} //-------------------------------------------------------------------------- -// Subclass: FileIException -// Programmer Binh-Minh Ribler - 2000 +// Subclass: LocationException +// Programmer Binh-Minh Ribler - 2014 //-------------------------------------------------------------------------- //-------------------------------------------------------------------------- -// Function: FileIException default constructor +// Function: LocationException default constructor ///\brief Default constructor. //-------------------------------------------------------------------------- -FileIException::FileIException():Exception(){} +LocationException::LocationException() : Exception(){} //-------------------------------------------------------------------------- -// Function: FileIException overloaded constructor -///\brief Creates a FileIException with the name of the function, +// Function: LocationException overloaded constructor +///\brief Creates a LocationException with the name of the function, /// in which the failure occurs, and an optional detailed message. ///\param func - IN: Name of the function where failure occurs ///\param message - IN: Message on the failure //-------------------------------------------------------------------------- -FileIException::FileIException(const H5std_string& func, const H5std_string& message) : Exception(func, message) {} +LocationException::LocationException(const H5std_string& func, const H5std_string& message) : Exception(func, message) {} //-------------------------------------------------------------------------- -// Function: FileIException destructor +// Function: LocationException destructor ///\brief Noop destructor. //-------------------------------------------------------------------------- -FileIException::~FileIException() throw() {} +LocationException::~LocationException() throw() {} //-------------------------------------------------------------------------- // Subclass: GroupIException @@ -361,7 +361,7 @@ FileIException::~FileIException() throw() {} // Function: GroupIException default constructor ///\brief Default constructor. //-------------------------------------------------------------------------- -GroupIException::GroupIException():Exception(){} +GroupIException::GroupIException() : LocationException(){} //-------------------------------------------------------------------------- // Function: GroupIException overloaded constructor ///\brief Creates a GroupIException with the name of the function, @@ -369,7 +369,7 @@ GroupIException::GroupIException():Exception(){} ///\param func - IN: Name of the function where failure occurs ///\param message - IN: Message on the failure //-------------------------------------------------------------------------- -GroupIException::GroupIException(const H5std_string& func, const H5std_string& message) : Exception(func, message) {} +GroupIException::GroupIException(const H5std_string& func, const H5std_string& message) : LocationException(func, message) {} //-------------------------------------------------------------------------- // Function: GroupIException destructor ///\brief Noop destructor. @@ -377,6 +377,29 @@ GroupIException::GroupIException(const H5std_string& func, const H5std_string& m GroupIException::~GroupIException() throw() {} //-------------------------------------------------------------------------- +// Subclass: FileIException +// Programmer Binh-Minh Ribler - 2000 +//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- +// Function: FileIException default constructor +///\brief Default constructor. +//-------------------------------------------------------------------------- +FileIException::FileIException():GroupIException(){} +//-------------------------------------------------------------------------- +// Function: FileIException overloaded constructor +///\brief Creates a FileIException with the name of the function, +/// in which the failure occurs, and an optional detailed message. +///\param func - IN: Name of the function where failure occurs +///\param message - IN: Message on the failure +//-------------------------------------------------------------------------- +FileIException::FileIException(const H5std_string& func, const H5std_string& message) : GroupIException(func, message) {} +//-------------------------------------------------------------------------- +// Function: FileIException destructor +///\brief Noop destructor. +//-------------------------------------------------------------------------- +FileIException::~FileIException() throw() {} + +//-------------------------------------------------------------------------- // Subclass: DataSpaceIException // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- @@ -384,7 +407,7 @@ GroupIException::~GroupIException() throw() {} // Function: DataSpaceIException default constructor ///\brief Default constructor. //-------------------------------------------------------------------------- -DataSpaceIException::DataSpaceIException():Exception(){} +DataSpaceIException::DataSpaceIException() : Exception(){} //-------------------------------------------------------------------------- // Function: DataSpaceIException overloaded constructor ///\brief Creates a DataSpaceIException with the name of the function, @@ -407,7 +430,7 @@ DataSpaceIException::~DataSpaceIException() throw() {} // Function: DataTypeIException default constructor ///\brief Default constructor. //-------------------------------------------------------------------------- -DataTypeIException::DataTypeIException():Exception(){} +DataTypeIException::DataTypeIException() : LocationException(){} //-------------------------------------------------------------------------- // Function: DataTypeIException overloaded constructor ///\brief Creates a DataTypeIException with the name of the function, @@ -415,7 +438,7 @@ DataTypeIException::DataTypeIException():Exception(){} ///\param func - IN: Name of the function where failure occurs ///\param message - IN: Message on the failure //-------------------------------------------------------------------------- -DataTypeIException::DataTypeIException(const H5std_string& func, const H5std_string& message) : Exception(func, message) {} +DataTypeIException::DataTypeIException(const H5std_string& func, const H5std_string& message) : LocationException(func, message) {} //-------------------------------------------------------------------------- // Function: DataTypeIException destructor ///\brief Noop destructor. @@ -430,7 +453,7 @@ DataTypeIException::~DataTypeIException() throw() {} // Function: PropListIException default constructor ///\brief Default constructor. //-------------------------------------------------------------------------- -PropListIException::PropListIException():Exception(){} +PropListIException::PropListIException() : Exception(){} //-------------------------------------------------------------------------- // Function: PropListIException overloaded constructor ///\brief Creates a PropListIException with the name of the function, @@ -453,7 +476,7 @@ PropListIException::~PropListIException() throw() {} // Function: DataSetIException default constructor ///\brief Default constructor. //-------------------------------------------------------------------------- -DataSetIException::DataSetIException():Exception(){} +DataSetIException::DataSetIException() : LocationException(){} //-------------------------------------------------------------------------- // Function: DataSetIException overloaded constructor ///\brief Creates a DataSetIException with the name of the function, @@ -461,7 +484,7 @@ DataSetIException::DataSetIException():Exception(){} ///\param func - IN: Name of the function where failure occurs ///\param message - IN: Message on the failure //-------------------------------------------------------------------------- -DataSetIException::DataSetIException(const H5std_string& func, const H5std_string& message) : Exception(func, message) {} +DataSetIException::DataSetIException(const H5std_string& func, const H5std_string& message) : LocationException(func, message) {} //-------------------------------------------------------------------------- // Function: DataSetIException destructor ///\brief Noop destructor. @@ -476,7 +499,7 @@ DataSetIException::~DataSetIException() throw() {} // Function: AttributeIException default constructor ///\brief Default constructor. //-------------------------------------------------------------------------- -AttributeIException::AttributeIException():Exception(){} +AttributeIException::AttributeIException() : LocationException(){} //-------------------------------------------------------------------------- // Function: AttributeIException overloaded constructor ///\brief Creates an AttributeIException with the name of the function, @@ -484,7 +507,7 @@ AttributeIException::AttributeIException():Exception(){} ///\param func - IN: Name of the function where failure occurs ///\param message - IN: Message on the failure //-------------------------------------------------------------------------- -AttributeIException::AttributeIException(const H5std_string& func, const H5std_string& message) : Exception(func, message) {} +AttributeIException::AttributeIException(const H5std_string& func, const H5std_string& message) : LocationException(func, message) {} //-------------------------------------------------------------------------- // Function: AttributeIException destructor ///\brief Noop destructor. @@ -499,7 +522,7 @@ AttributeIException::~AttributeIException() throw() {} // Function: ReferenceException default constructor ///\brief Default constructor. //-------------------------------------------------------------------------- -ReferenceException::ReferenceException():Exception(){} +ReferenceException::ReferenceException() : Exception(){} //-------------------------------------------------------------------------- // Function: ReferenceException overloaded constructor ///\brief Creates a ReferenceException with the name of the function, @@ -522,7 +545,7 @@ ReferenceException::~ReferenceException() throw() {} // Function: LibraryIException default constructor ///\brief Default constructor. //-------------------------------------------------------------------------- -LibraryIException::LibraryIException():Exception(){} +LibraryIException::LibraryIException() : Exception(){} //-------------------------------------------------------------------------- // Function: LibraryIException overloaded constructor ///\brief Creates a LibraryIException with the name of the function, @@ -538,29 +561,6 @@ LibraryIException::LibraryIException(const H5std_string& func, const H5std_strin LibraryIException::~LibraryIException() throw() {} //-------------------------------------------------------------------------- -// Subclass: LocationException -// Programmer Binh-Minh Ribler - 2014 -//-------------------------------------------------------------------------- -//-------------------------------------------------------------------------- -// Function: LocationException default constructor -///\brief Default constructor. -//-------------------------------------------------------------------------- -LocationException::LocationException():Exception(){} -//-------------------------------------------------------------------------- -// Function: LocationException overloaded constructor -///\brief Creates a LocationException with the name of the function, -/// in which the failure occurs, and an optional detailed message. -///\param func - IN: Name of the function where failure occurs -///\param message - IN: Message on the failure -//-------------------------------------------------------------------------- -LocationException::LocationException(const H5std_string& func, const H5std_string& message) : Exception(func, message) {} -//-------------------------------------------------------------------------- -// Function: LocationException destructor -///\brief Noop destructor. -//-------------------------------------------------------------------------- -LocationException::~LocationException() throw() {} - -//-------------------------------------------------------------------------- // Subclass: IdComponentException // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- diff --git a/c++/src/H5Exception.h b/c++/src/H5Exception.h index 7315e11..e15d81c 100644 --- a/c++/src/H5Exception.h +++ b/c++/src/H5Exception.h @@ -91,20 +91,27 @@ class H5_DLLCPP Exception { H5std_string func_name; }; -class H5_DLLCPP FileIException : public Exception { +class H5_DLLCPP LocationException : public Exception { public: - FileIException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG); - FileIException(); - virtual ~FileIException() throw(); + LocationException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG); + LocationException(); + virtual ~LocationException() throw(); }; -class H5_DLLCPP GroupIException : public Exception { +class H5_DLLCPP GroupIException : public LocationException { public: GroupIException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG); GroupIException(); virtual ~GroupIException() throw(); }; +class H5_DLLCPP FileIException : public GroupIException { + public: + FileIException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG); + FileIException(); + virtual ~FileIException() throw(); +}; + class H5_DLLCPP DataSpaceIException : public Exception { public: DataSpaceIException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG); @@ -112,7 +119,7 @@ class H5_DLLCPP DataSpaceIException : public Exception { virtual ~DataSpaceIException() throw(); }; -class H5_DLLCPP DataTypeIException : public Exception { +class H5_DLLCPP DataTypeIException : public LocationException { public: DataTypeIException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG); DataTypeIException(); @@ -126,14 +133,14 @@ class H5_DLLCPP PropListIException : public Exception { virtual ~PropListIException() throw(); }; -class H5_DLLCPP DataSetIException : public Exception { +class H5_DLLCPP DataSetIException : public LocationException { public: DataSetIException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG); DataSetIException(); virtual ~DataSetIException() throw(); }; -class H5_DLLCPP AttributeIException : public Exception { +class H5_DLLCPP AttributeIException : public LocationException { public: AttributeIException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG); AttributeIException(); @@ -154,13 +161,6 @@ class H5_DLLCPP LibraryIException : public Exception { virtual ~LibraryIException() throw(); }; -class H5_DLLCPP LocationException : public Exception { - public: - LocationException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG); - LocationException(); - virtual ~LocationException() throw(); -}; - class H5_DLLCPP IdComponentException : public Exception { public: IdComponentException(const H5std_string& func_name, const H5std_string& message = DEFAULT_MSG); diff --git a/c++/src/H5File.cpp b/c++/src/H5File.cpp index 782831b..7b19c7e 100644 --- a/c++/src/H5File.cpp +++ b/c++/src/H5File.cpp @@ -634,23 +634,15 @@ void H5File::close() //-------------------------------------------------------------------------- // Function: H5File::throwException -///\brief Throws file exception - initially implemented for CommonFG +///\brief Throws H5::FileIException. ///\param func_name - Name of the function where failure occurs ///\param msg - Message describing the failure ///\exception H5::FileIException -// Description -// This function is used in CommonFG implementation so that -// proper exception can be thrown for file or group. The -// argument func_name is a member of CommonFG and "H5File::" -// will be inserted to indicate the function called is an -// implementation of H5File. -// Programmer Binh-Minh Ribler - 2000 +// December 2000 //-------------------------------------------------------------------------- void H5File::throwException(const H5std_string& func_name, const H5std_string& msg) const { - H5std_string full_name = func_name; - full_name.insert(0, "H5File::"); - throw FileIException(full_name, msg); + throw FileIException(inMemFunc(func_name.c_str()), msg); } //-------------------------------------------------------------------------- diff --git a/c++/src/H5Group.cpp b/c++/src/H5Group.cpp index c3f390c..dd2dd48 100644 --- a/c++/src/H5Group.cpp +++ b/c++/src/H5Group.cpp @@ -165,7 +165,7 @@ void Group::p_setId(const hid_t new_id) ///\brief Closes this group. /// ///\exception H5::GroupIException -// Programmer Binh-Minh Ribler - Mar 9, 2005 +// March 2005 //-------------------------------------------------------------------------- void Group::close() { @@ -187,19 +187,11 @@ void Group::close() ///\param func_name - Name of the function where failure occurs ///\param msg - Message describing the failure ///\exception H5::GroupIException -// Description -// This function is used in CommonFG implementation so that -// proper exception can be thrown for file or group. The -// argument func_name is a member of CommonFG and "Group::" -// will be inserted to indicate the function called is an -// implementation of Group. -// Programmer Binh-Minh Ribler - 2000 +// December 2000 //-------------------------------------------------------------------------- void Group::throwException(const H5std_string& func_name, const H5std_string& msg) const { - H5std_string full_name = func_name; - full_name.insert(0, "Group::"); - throw GroupIException(full_name, msg); + throw GroupIException(inMemFunc(func_name.c_str()), msg); } //-------------------------------------------------------------------------- diff --git a/c++/src/H5IdComponent.cpp b/c++/src/H5IdComponent.cpp index ef17b38..c54e901 100644 --- a/c++/src/H5IdComponent.cpp +++ b/c++/src/H5IdComponent.cpp @@ -299,11 +299,7 @@ IdComponent::IdComponent() // Function: IdComponent::p_get_file_name (protected) // Purpose: Gets the name of the file, in which this object belongs. // Exception: H5::IdComponentException -// Description: -// This function is protected so that the user applications can -// only have access to its code via allowable classes, namely, -// Attribute and H5Location subclasses. -// Programmer Binh-Minh Ribler - Jul, 2004 +// July 2004 //-------------------------------------------------------------------------- H5std_string IdComponent::p_get_file_name() const { @@ -312,7 +308,7 @@ H5std_string IdComponent::p_get_file_name() const // Preliminary call to H5Fget_name to get the length of the file name ssize_t name_size = H5Fget_name(temp_id, NULL, 0); - // If H5Aget_name returns a negative value, raise an exception, + // If H5Fget_name returns a negative value, raise an exception, if(name_size < 0) { throw IdComponentException("", "H5Fget_name failed"); diff --git a/c++/src/H5IdComponent.h b/c++/src/H5IdComponent.h index 9a45634..744a780 100644 --- a/c++/src/H5IdComponent.h +++ b/c++/src/H5IdComponent.h @@ -72,6 +72,10 @@ class H5_DLLCPP IdComponent { // Gets the identifier of this object. virtual hid_t getId () const = 0; + // For subclasses to throw appropriate exception, used in H5Location, + // H5CommonFG, and H5Object. + virtual void throwException(const H5std_string& func_name, const H5std_string& msg) const {}; + // Pure virtual function for there are various H5*close for the // subclasses. virtual void close() = 0; diff --git a/c++/src/H5LaccProp.cpp b/c++/src/H5LaccProp.cpp index 1267286..d5e7a1c 100644 --- a/c++/src/H5LaccProp.cpp +++ b/c++/src/H5LaccProp.cpp @@ -116,7 +116,7 @@ void LinkAccPropList::setNumLinks(size_t nlinks) const // Throw exception if H5Pset_nlinks returns failure if (ret_value < 0) { - throw PropListIException("setNumLinks", "H5Pset_nlinks failed"); + throw PropListIException("LinkAccPropList::setNumLinks", "H5Pset_nlinks failed"); } } @@ -134,7 +134,7 @@ size_t LinkAccPropList::getNumLinks() const // Throw exception if H5Pget_nlinks returns failure if (ret_value < 0) { - throw PropListIException("getNumLinks", "H5Pget_nlinks failed"); + throw PropListIException("LinkAccPropList::getNumLinks", "H5Pget_nlinks failed"); } return(nlinks); } diff --git a/c++/src/H5LaccProp.h b/c++/src/H5LaccProp.h index 39fe7b8..9e7802f 100644 --- a/c++/src/H5LaccProp.h +++ b/c++/src/H5LaccProp.h @@ -12,9 +12,6 @@ * help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -// Class LinkAccPropList represents the HDF5 file access property list and -// inherits from DataType. - #ifndef __H5LinkAccPropList_H #define __H5LinkAccPropList_H diff --git a/c++/src/H5LcreatProp.cpp b/c++/src/H5LcreatProp.cpp index b6d6bd6..1f17f88 100644 --- a/c++/src/H5LcreatProp.cpp +++ b/c++/src/H5LcreatProp.cpp @@ -39,7 +39,7 @@ LinkCreatPropList* LinkCreatPropList::DEFAULT_ = 0; // If LinkCreatPropList::DEFAULT_ already points to an allocated // object, throw a PropListIException. This scenario should not // happen. -// May, 2018 +// May 2018 //-------------------------------------------------------------------------- LinkCreatPropList* LinkCreatPropList::getConstant() { @@ -65,7 +65,7 @@ LinkCreatPropList* LinkCreatPropList::getConstant() // Purpose: Deletes the constant object that LinkCreatPropList::DEFAULT_ // points to. // exception H5::PropListIException -// May, 2018 +// May 2018 //-------------------------------------------------------------------------- void LinkCreatPropList::deleteConstants() { @@ -83,7 +83,7 @@ const LinkCreatPropList& LinkCreatPropList::DEFAULT = *getConstant(); //-------------------------------------------------------------------------- // Function: Default Constructor ///\brief Creates a file access property list -// May, 2018 +// May 2018 //-------------------------------------------------------------------------- LinkCreatPropList::LinkCreatPropList() : StrCreatPropList(H5P_LINK_CREATE) {} @@ -91,7 +91,7 @@ LinkCreatPropList::LinkCreatPropList() : StrCreatPropList(H5P_LINK_CREATE) {} // Function: LinkCreatPropList copy constructor ///\brief Copy constructor: same HDF5 object as \a original ///\param original - IN: LinkCreatPropList instance to copy -// May, 2018 +// May 2018 //-------------------------------------------------------------------------- LinkCreatPropList::LinkCreatPropList(const LinkCreatPropList& original) : StrCreatPropList(original) {} @@ -99,14 +99,14 @@ LinkCreatPropList::LinkCreatPropList(const LinkCreatPropList& original) : StrCre // Function: LinkCreatPropList overloaded constructor ///\brief Creates a file access property list using the id of an /// existing one. -// May, 2018 +// May 2018 //-------------------------------------------------------------------------- LinkCreatPropList::LinkCreatPropList(const hid_t plist_id) : StrCreatPropList(plist_id) {} //-------------------------------------------------------------------------- // Function: LinkCreatPropList destructor ///\brief Noop destructor -// May, 2018 +// May 2018 //-------------------------------------------------------------------------- LinkCreatPropList::~LinkCreatPropList() {} diff --git a/c++/src/H5Location.cpp b/c++/src/H5Location.cpp index 319fa9e..43ba34c 100644 --- a/c++/src/H5Location.cpp +++ b/c++/src/H5Location.cpp @@ -388,7 +388,7 @@ int H5Location::getNumAttrs() const H5O_info_t objinfo; /* Object info */ if(H5Oget_info(getId(), &objinfo) < 0) - throw AttributeIException(inMemFunc("getNumAttrs"), "H5Oget_info failed"); + throwException("getNumAttrs", "H5Oget_info failed"); else return(static_cast<int>(objinfo.num_attrs)); } @@ -398,8 +398,13 @@ int H5Location::getNumAttrs() const ///\brief Checks if a link of a given name exists in a location. ///\param name - IN: Searched name - \c char* ///\param lapl - IN: Link access property list -///\exception H5::LocationException -// Nov, 2016 +///\exception One of the following: +/// H5::GroupIException +/// H5::FileIException +/// H5::DataSetIException +/// H5::DataTypeIException +/// H5::AttributeIException +// Nov 2016 //-------------------------------------------------------------------------- bool H5Location::nameExists(const char* name, const LinkAccPropList& lapl) const { @@ -410,7 +415,7 @@ bool H5Location::nameExists(const char* name, const LinkAccPropList& lapl) const return false; else // Raise exception when H5Lexists returns a negative value { - throw LocationException(inMemFunc("nameExists"), "H5Lexists failed"); + throwException("nameExists", "H5Lexists failed"); } } @@ -435,10 +440,15 @@ bool H5Location::nameExists(const H5std_string& name, const LinkAccPropList& lap /// which can be either of these values: /// \li \c H5F_SCOPE_GLOBAL - Flushes the entire virtual file /// \li \c H5F_SCOPE_LOCAL - Flushes only the specified file -///\exception H5::LocationException +///\exception One of the following: +/// H5::GroupIException +/// H5::FileIException +/// H5::DataSetIException +/// H5::DataTypeIException +/// H5::AttributeIException ///\par Description /// This location is used to identify the file to be flushed. -// Programmer Binh-Minh Ribler - 2012 +// December 2005 // Modification // Sep 2012 - BMR // Moved from H5File/H5Object @@ -448,7 +458,7 @@ void H5Location::flush(H5F_scope_t scope) const herr_t ret_value = H5Fflush(getId(), scope); if(ret_value < 0) { - throw LocationException(inMemFunc("flush"), "H5Fflush failed"); + throwException("flush", "H5Fflush failed"); } } @@ -456,16 +466,21 @@ void H5Location::flush(H5F_scope_t scope) const // Function: H5Location::getFileName ///\brief Gets the name of the file, in which this HDF5 object belongs. ///\return File name -///\exception H5::LocationException -// Programmer Binh-Minh Ribler - Jul, 2004 +///\exception One of the following: +/// H5::GroupIException +/// H5::FileIException +/// H5::DataSetIException +/// H5::DataTypeIException +/// H5::AttributeIException +// July 2004 //-------------------------------------------------------------------------- H5std_string H5Location::getFileName() const { try { return(p_get_file_name()); } - catch (LocationException& E) { - throw FileIException(inMemFunc("getFileName"), E.getDetailMsg()); + catch (IdComponentException& E) { + throwException("getFileName", E.getDetailMsg()); } } @@ -473,15 +488,20 @@ H5std_string H5Location::getFileName() const // Function: H5Location::getObjectInfo ///\brief Retrieve information about an object, specified by location. /// -///\exception H5::LocationException -// Programmer Binh-Minh Ribler - Aug, 2017 +///\exception One of the following: +/// H5::GroupIException +/// H5::FileIException +/// H5::DataSetIException +/// H5::DataTypeIException +/// H5::AttributeIException +// August 2017 //-------------------------------------------------------------------------- void H5Location::getObjectInfo(H5O_info_t *objinfo) const { herr_t ret_value = H5Oget_info(getId(), objinfo); if (ret_value < 0) { - throw LocationException(inMemFunc("getObjectInfo"), "H5Oget_info failed"); + throwException("getObjectInfo", "H5Oget_info failed"); } } @@ -489,8 +509,13 @@ void H5Location::getObjectInfo(H5O_info_t *objinfo) const // Function: H5Location::getObjectInfo ///\brief Retrieve information about an object, specified by name. /// -///\exception H5::LocationException -// Programmer Binh-Minh Ribler - Aug, 2017 +///\exception One of the following: +/// H5::GroupIException +/// H5::FileIException +/// H5::DataSetIException +/// H5::DataTypeIException +/// H5::AttributeIException +// August 2017 //-------------------------------------------------------------------------- void H5Location::getObjectInfo(const char *name, H5O_info_t *objinfo, const LinkAccPropList& lapl) const @@ -498,7 +523,7 @@ void H5Location::getObjectInfo(const char *name, H5O_info_t *objinfo, herr_t ret_value = H5Oget_info_by_name(getId(), name, objinfo, lapl.getId()); if (ret_value < 0) { - throw LocationException(inMemFunc("getObjectInfo"), "H5Oget_info_by_name failed"); + throwException("getObjectInfo", "H5Oget_info_by_name failed"); } } @@ -506,8 +531,13 @@ void H5Location::getObjectInfo(const char *name, H5O_info_t *objinfo, // Function: H5Location::getObjectInfo ///\brief Retrieve information about an object, specified by name. /// -///\exception H5::LocationException -// Programmer Binh-Minh Ribler - Aug, 2017 +///\exception One of the following: +/// H5::GroupIException +/// H5::FileIException +/// H5::DataSetIException +/// H5::DataTypeIException +/// H5::AttributeIException +// August 2017 //-------------------------------------------------------------------------- void H5Location::getObjectInfo(const H5std_string& name, H5O_info_t *objinfo, const LinkAccPropList& lapl) const @@ -515,7 +545,7 @@ void H5Location::getObjectInfo(const H5std_string& name, H5O_info_t *objinfo, herr_t ret_value = H5Oget_info_by_name(getId(), name.c_str(), objinfo, lapl.getId()); if (ret_value < 0) { - throw LocationException(inMemFunc("getObjectInfo"), "H5Oget_info_by_name failed"); + throwException("getObjectInfo", "H5Oget_info_by_name failed"); } } @@ -525,14 +555,16 @@ void H5Location::getObjectInfo(const H5std_string& name, H5O_info_t *objinfo, ///\return Object version, which can have the following values: /// \li \c H5O_VERSION_1 /// \li \c H5O_VERSION_2 -///\exception H5::LocationException +///\exception One of the following: +/// H5::GroupIException +/// H5::FileIException +/// H5::DataSetIException +/// H5::DataTypeIException +/// H5::AttributeIException /// Exception will be thrown when: /// - an error returned by the C API /// - version number is not one of the valid values above -// Programmer Binh-Minh Ribler - May, 2017 -// Developer's Note -// Maybe, this should be moved to H5Object because H5Oget_info is -// supposed to take an object ID, so it shouldn't be a location. +// August 2017 //-------------------------------------------------------------------------- unsigned H5Location::objVersion() const { @@ -544,13 +576,13 @@ unsigned H5Location::objVersion() const // Throw exception if C API returns failure if (ret_value < 0) - throw LocationException(inMemFunc("objVersion"), "H5Oget_info failed"); + throwException("objVersion", "H5Oget_info failed"); // Return a valid version or throw an exception for invalid value else { version = objinfo.hdr.version; if (version != H5O_VERSION_1 && version != H5O_VERSION_2) - throw LocationException(inMemFunc("objVersion"), "Invalid version for object"); + throwException("objVersion", "Invalid version for object"); } return(version); } @@ -560,7 +592,12 @@ unsigned H5Location::objVersion() const ///\brief Sets or resets the comment for an object specified by its name. ///\param name - IN: Name of the object ///\param comment - IN: New comment -///\exception H5::LocationException +///\exception One of the following: +/// H5::GroupIException +/// H5::FileIException +/// H5::DataSetIException +/// H5::DataTypeIException +/// H5::AttributeIException ///\par Description /// If \a comment is an empty string or a null pointer, the comment /// message is removed from the object. @@ -568,18 +605,15 @@ unsigned H5Location::objVersion() const /// strings. They can be attached to any object that has an /// object header, e.g., data sets, groups, named data types, /// and data spaces, but not symbolic links. -// Programmer Binh-Minh Ribler - 2000 (moved from CommonFG, Sep 2013) +// July 2004 // Modification -// 2007: QAK modified to use H5O APIs; however the first parameter is -// no longer just file or group, this function should be moved -// to another class to accommodate attribute, dataset, and named -// datatype. - BMR +// Moved from CommonFG, Sep 2013 //-------------------------------------------------------------------------- void H5Location::setComment(const char* name, const char* comment) const { herr_t ret_value = H5Oset_comment_by_name(getId(), name, comment, H5P_DEFAULT); if(ret_value < 0) - throw LocationException(inMemFunc("setComment"), "H5Oset_comment_by_name failed"); + throwException("setComment", "H5Oset_comment_by_name failed"); } //-------------------------------------------------------------------------- @@ -587,7 +621,9 @@ void H5Location::setComment(const char* name, const char* comment) const ///\brief This is an overloaded member function, provided for convenience. /// It differs from the above function in that it takes an /// \c H5std_string for \a name and \a comment. -// Programmer Binh-Minh Ribler - 2000 (moved from CommonFG, Sep 2013) +// July 2004 +// Modification +// Moved from CommonFG, Sep 2013 //-------------------------------------------------------------------------- void H5Location::setComment(const H5std_string& name, const H5std_string& comment) const { @@ -599,14 +635,19 @@ void H5Location::setComment(const H5std_string& name, const H5std_string& commen ///\brief This is an overloaded member function, provided for convenience. /// It differs from the above function in that it doesn't take /// an object name. -// Programmer Binh-Minh Ribler - Sep 2013 -// Modification +///\exception One of the following: +/// H5::GroupIException +/// H5::FileIException +/// H5::DataSetIException +/// H5::DataTypeIException +/// H5::AttributeIException +// Sep 2013 //-------------------------------------------------------------------------- void H5Location::setComment(const char* comment) const { herr_t ret_value = H5Oset_comment_by_name(getId(), ".", comment, H5P_DEFAULT); if(ret_value < 0) - throw LocationException(inMemFunc("setComment"), "H5Oset_comment_by_name failed"); + throwException("setComment", "H5Oset_comment_by_name failed"); } //-------------------------------------------------------------------------- @@ -614,7 +655,7 @@ void H5Location::setComment(const char* comment) const ///\brief This is an overloaded member function, provided for convenience. /// It differs from the above function in that it takes an /// \c H5std_string for \a comment. -// Programmer Binh-Minh Ribler - Sep 2013 +// Sep 2013 //-------------------------------------------------------------------------- void H5Location::setComment(const H5std_string& comment) const { @@ -625,18 +666,21 @@ void H5Location::setComment(const H5std_string& comment) const // Function: H5Location::removeComment ///\brief Removes the comment from an object specified by its name. ///\param name - IN: Name of the object -///\exception H5::LocationException -// Programmer Binh-Minh Ribler - May 2005 (moved from CommonFG, Sep 2013) -// 2007: QAK modified to use H5O APIs; however the first parameter is -// no longer just file or group, this function should be moved -// to another class to accommodate attribute, dataset, and named -// datatype. - BMR +///\exception One of the following: +/// H5::GroupIException +/// H5::FileIException +/// H5::DataSetIException +/// H5::DataTypeIException +/// H5::AttributeIException +// July 2004 +// Modification +// Moved from CommonFG, Sep 2013 //-------------------------------------------------------------------------- void H5Location::removeComment(const char* name) const { herr_t ret_value = H5Oset_comment_by_name(getId(), name, NULL, H5P_DEFAULT); if(ret_value < 0) - throw LocationException(inMemFunc("removeComment"), "H5Oset_comment_by_name failed"); + throwException("removeComment", "H5Oset_comment_by_name failed"); } //-------------------------------------------------------------------------- @@ -644,11 +688,13 @@ void H5Location::removeComment(const char* name) const ///\brief This is an overloaded member function, provided for convenience. /// It differs from the above function in that it takes an /// \c H5std_string for \a name. -// Programmer Binh-Minh Ribler - May 2005 (moved from CommonFG, Sep 2013) +// July 2004 +// Modification +// Moved from CommonFG, Sep 2013 //-------------------------------------------------------------------------- void H5Location::removeComment(const H5std_string& name) const { - removeComment (name.c_str()); + removeComment(name.c_str()); } //-------------------------------------------------------------------------- @@ -658,13 +704,18 @@ void H5Location::removeComment(const H5std_string& name) const ///\param buf_size - IN: Length of the comment to retrieve ///\param comment - OUT: Retrieved comment ///\return Actual length of the comment -///\exception H5::LocationException +///\exception One of the following: +/// H5::GroupIException +/// H5::FileIException +/// H5::DataSetIException +/// H5::DataTypeIException +/// H5::AttributeIException ///\par Description /// This function retrieves \a buf_size characters of the comment /// including the null terminator. Thus, if the actual length /// of the comment is more than buf_size-1, the retrieved comment /// will be truncated to accommodate the null terminator. -// Programmer Binh-Minh Ribler - Mar 2014 +// March 2014 //-------------------------------------------------------------------------- ssize_t H5Location::getComment(const char* name, size_t buf_size, char* comment) const { @@ -676,7 +727,7 @@ ssize_t H5Location::getComment(const char* name, size_t buf_size, char* comment) // If H5Oget_comment_by_name returns a negative value, raise an exception if (comment_len < 0) { - throw LocationException(inMemFunc("getComment"), "H5Oget_comment_by_name failed"); + throwException("getComment", "H5Oget_comment_by_name failed"); } // If the comment is longer than the provided buffer size, the C library // will not null terminate it @@ -694,8 +745,15 @@ ssize_t H5Location::getComment(const char* name, size_t buf_size, char* comment) ///\param name - IN: Name of the object ///\param buf_size - IN: Length of the comment to retrieve, default to 0 ///\return Comment string -///\exception H5::LocationException -// Programmer Binh-Minh Ribler - 2000 (moved from CommonFG, Sep 2013) +///\exception One of the following: +/// H5::GroupIException +/// H5::FileIException +/// H5::DataSetIException +/// H5::DataTypeIException +/// H5::AttributeIException +// July 2004 +// Modification +// Moved from CommonFG, Sep 2013 //-------------------------------------------------------------------------- H5std_string H5Location::getComment(const char* name, size_t buf_size) const { @@ -709,7 +767,7 @@ H5std_string H5Location::getComment(const char* name, size_t buf_size) const // If H5Oget_comment_by_name returns a negative value, raise an exception if (comment_len < 0) { - throw LocationException(inMemFunc("getComment"), "H5Oget_comment_by_name failed"); + throwException("getComment", "H5Oget_comment_by_name failed"); } // If comment exists, calls C routine again to get it @@ -730,7 +788,7 @@ H5std_string H5Location::getComment(const char* name, size_t buf_size) const if (temp_len < 0) { delete []comment_C; - throw LocationException(inMemFunc("getComment"), "H5Oget_comment_by_name failed"); + throwException("getComment", "H5Oget_comment_by_name failed"); } // Convert the C comment to return @@ -749,7 +807,9 @@ H5std_string H5Location::getComment(const char* name, size_t buf_size) const ///\brief This is an overloaded member function, provided for convenience. /// It differs from the above function in that it takes an /// \c H5std_string for \a name. -// Programmer Binh-Minh Ribler - 2000 (moved from CommonFG, Sep 2013) +// July 2004 +// Modification +// Moved from CommonFG, Sep 2013 //-------------------------------------------------------------------------- H5std_string H5Location::getComment(const H5std_string& name, size_t buf_size) const { @@ -760,21 +820,25 @@ H5std_string H5Location::getComment(const H5std_string& name, size_t buf_size) c // Function: H5Location::openObjId ///\brief Opens an object without knowing the object type. ///\param obj_name - IN: Path to the object -///\param lapl - IN: Access property list for the link pointing -/// to the object -///\exception H5::LocationException +///\param lapl - IN: Access plist for the link pointing to the object +///\exception One of the following: +/// H5::GroupIException +/// H5::FileIException +/// H5::DataSetIException +/// H5::DataTypeIException +/// H5::AttributeIException ///\par Description /// This function opens an object at this location, using /// H5Oopen. Thus, an object can be opened without knowing -/// the object's type. -// Programmer Binh-Minh Ribler - May, 2017 +/// its type. +// May 2017 //-------------------------------------------------------------------------- hid_t H5Location::openObjId(const char* obj_name, const LinkAccPropList& lapl) const { hid_t ret_value = H5Oopen(getId(), obj_name, lapl.getId()); if (ret_value < 0) { - throw LocationException(inMemFunc("openObjId"), "H5Oopen failed"); + throwException("openObjId", "H5Oopen failed"); } return(ret_value); } @@ -787,7 +851,7 @@ hid_t H5Location::openObjId(const char* obj_name, const LinkAccPropList& lapl) c ///\param lapl - IN: Access property list for the link pointing to /// the object ///\exception H5::LocationException -// Programmer Binh-Minh Ribler - May, 2017 +// May 2017 //-------------------------------------------------------------------------- hid_t H5Location::openObjId(const H5std_string& obj_name, const LinkAccPropList& lapl) const { @@ -799,14 +863,14 @@ hid_t H5Location::openObjId(const H5std_string& obj_name, const LinkAccPropList& ///\brief Closes an object, which was opened with H5Location::openObjId /// ///\exception H5::LocationException -// May, 2017 +// May 2017 //-------------------------------------------------------------------------- void H5Location::closeObjId(hid_t obj_id) { herr_t ret_value = H5Oclose(obj_id); if (ret_value < 0) { - throw Exception("closeObjId", "H5Oclose failed"); + throw LocationException("closeObjId", "H5Oclose failed"); } } diff --git a/c++/src/H5Object.cpp b/c++/src/H5Object.cpp index 8fe8e56..4697d9c 100644 --- a/c++/src/H5Object.cpp +++ b/c++/src/H5Object.cpp @@ -11,6 +11,12 @@ * help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +#ifdef OLD_HEADER_FILENAME +#include <iostream.h> +#else +#include <iostream> +#endif + #include <string> #include "H5private.h" // for HDmemset @@ -28,6 +34,11 @@ namespace H5 { +#ifndef H5_NO_STD + using std::cerr; + using std::endl; +#endif // H5_NO_STD + #ifndef DOXYGEN_SHOULD_SKIP_THIS // userAttrOpWrpr simply interfaces between the user's function and the // C library function H5Aiterate2; used to resolve the different prototype @@ -299,10 +310,10 @@ void H5Object::renameAttr(const H5std_string& oldname, const H5std_string& newna //-------------------------------------------------------------------------- int H5Object::getNumAttrs() const { - H5O_info_t oinfo; /* Object info */ + H5O_info_t oinfo; /* Object info */ if(H5Oget_info(getId(), &oinfo) < 0) - throw AttributeIException(inMemFunc("getNumAttrs"), "H5Oget_info failed"); + throwException("getNumAttrs", "H5Oget_info failed"); else return(static_cast<int>(oinfo.num_attrs)); } @@ -321,11 +332,11 @@ ssize_t H5Object::getObjName(char *obj_name, size_t buf_size) const // If H5Iget_name returns a negative value, raise an exception if (name_size < 0) { - throw Exception(inMemFunc("getObjName"), "H5Iget_name failed"); + throwException("getObjName", "H5Iget_name failed"); } else if (name_size == 0) { - throw Exception(inMemFunc("getObjName"), "Object must have a name, but name length is 0"); + throwException("getObjName", "Object must have a name, but name length is 0"); } // Return length of the name return(name_size); @@ -337,7 +348,6 @@ ssize_t H5Object::getObjName(char *obj_name, size_t buf_size) const ///\return Name of the object ///\exception H5::Exception // Programmer Binh-Minh Ribler - Mar, 2014 -// Modification //-------------------------------------------------------------------------- H5std_string H5Object::getObjName() const { @@ -349,11 +359,11 @@ H5std_string H5Object::getObjName() const // If H5Iget_name failed, throw exception if (name_size < 0) { - throw Exception(inMemFunc("getObjName"), "H5Iget_name failed"); + throwException("getObjName", "H5Iget_name failed"); } else if (name_size == 0) { - throw Exception(inMemFunc("getObjName"), "Object must have a name, but name length is 0"); + throwException("getObjName", "Object must have a name, but name length is 0"); } // Object's name exists, retrieve it else if (name_size > 0) diff --git a/c++/src/H5Object.h b/c++/src/H5Object.h index afeea7d..4d40415 100644 --- a/c++/src/H5Object.h +++ b/c++/src/H5Object.h @@ -48,6 +48,9 @@ class H5_DLLCPP H5Object : public H5Location { // Given its index, opens the attribute that belongs to this object. Attribute openAttribute(const unsigned int idx) const; + // Determines the number of attributes belong to this object. + int getNumAttrs() const; + // Checks whether the named attribute exists for this object. bool attrExists(const char* name) const; bool attrExists(const H5std_string& name) const; @@ -60,9 +63,6 @@ class H5_DLLCPP H5Object : public H5Location { void removeAttr(const char* name) const; void removeAttr(const H5std_string& name) const; - // Determines the number of attributes belong to this object. - int getNumAttrs() const; - // Gets the name of this HDF5 object, i.e., Group, DataSet, or // DataType. ssize_t getObjName(char *obj_name, size_t buf_size = 0) const; diff --git a/c++/src/H5StrcreatProp.cpp b/c++/src/H5StrcreatProp.cpp index 6237e2b..79749d8 100644 --- a/c++/src/H5StrcreatProp.cpp +++ b/c++/src/H5StrcreatProp.cpp @@ -25,7 +25,7 @@ namespace H5 { // Function: StrCreatPropList::setCharEncoding ///\brief Sets the character encoding of the string. ///\exception H5::PropListIException -// March, 2018 +// March 2018 //-------------------------------------------------------------------------- void StrCreatPropList::setCharEncoding(H5T_cset_t encoding) const { @@ -33,7 +33,7 @@ void StrCreatPropList::setCharEncoding(H5T_cset_t encoding) const // Throw exception if H5Pset_char_encoding returns failure if (ret_value < 0) { - throw PropListIException("setCharEncoding", "H5Pset_char_encoding failed"); + throw PropListIException("StrCreatPropList::setCharEncoding", "H5Pset_char_encoding failed"); } } @@ -41,7 +41,7 @@ void StrCreatPropList::setCharEncoding(H5T_cset_t encoding) const // Function: StrCreatPropList::getCharEncoding ///\brief Gets the character encoding of the string. ///\exception H5::PropListIException -// March, 2018 +// March 2018 //-------------------------------------------------------------------------- H5T_cset_t StrCreatPropList::getCharEncoding() const { @@ -50,7 +50,7 @@ H5T_cset_t StrCreatPropList::getCharEncoding() const // Throw exception if H5Pget_char_encoding returns failure if (ret_value < 0) { - throw PropListIException("getCharEncoding", "H5Pget_char_encoding failed"); + throw PropListIException("StrCreatPropList::getCharEncoding", "H5Pget_char_encoding failed"); } return(encoding); } diff --git a/c++/test/dsets.cpp b/c++/test/dsets.cpp index 8d2618b..0a187ef 100644 --- a/c++/test/dsets.cpp +++ b/c++/test/dsets.cpp @@ -68,6 +68,8 @@ static size_t filter_bogus(unsigned int flags, size_t cd_nelmts, * *------------------------------------------------------------------------- */ +const H5std_string DSET_COMMENT ("This is a dataset"); +const H5std_string NON_EXISTING_DSET ("does_not_exist"); static herr_t test_create( H5File& file) { @@ -83,13 +85,12 @@ test_create( H5File& file) DataSpace space (2, dims, NULL); // Create a dataset using the default dataset creation properties. - // We're not sure what they are, so we won't check. dataset = new DataSet (file.createDataSet (DSET_DEFAULT_NAME, PredType::NATIVE_DOUBLE, space)); // Add a comment to the dataset - file.setComment (DSET_DEFAULT_NAME, "This is a dataset"); + file.setComment (DSET_DEFAULT_NAME, DSET_COMMENT); // Close the dataset delete dataset; @@ -120,7 +121,7 @@ test_create( H5File& file) // Get and verify the comment from this dataset, using // H5std_string getComment(const H5std_string& name, <buf_size=0, by default>) H5std_string comment = file.getComment(DSET_DEFAULT_NAME); - verify_val(comment, "This is a dataset", "DataSet::getComment", __LINE__, __FILE__); + verify_val(comment, DSET_COMMENT, "DataSet::getComment", __LINE__, __FILE__); // Close the dataset when accessing is completed delete dataset; @@ -132,24 +133,24 @@ test_create( H5File& file) // exception is not thrown for this action by openDataSet, then // display failure information and throw an exception. try { - dataset = new DataSet (file.openDataSet( "does_not_exist" )); + dataset = new DataSet (file.openDataSet(NON_EXISTING_DSET)); // continuation here, that means no exception has been thrown throw InvalidActionException("H5File::openDataSet", "Attempted to open a non-existent dataset"); } - catch (FileIException& E ) // catching creating non-existent dataset + catch (FileIException& E ) // catching opening non-existent dataset {} // do nothing, exception expected - // Create a new dataset that uses chunked storage instead of the default - // layout. + // Create a new dataset that uses chunked storage instead of the + // default layout. DSetCreatPropList create_parms; - hsize_t csize[2]; + hsize_t csize[2]; csize[0] = 5; csize[1] = 100; create_parms.setChunk( 2, csize ); dataset = new DataSet (file.createDataSet - (DSET_CHUNKED_NAME, PredType::NATIVE_DOUBLE, space, create_parms)); + (DSET_CHUNKED_NAME, PredType::NATIVE_DOUBLE, space, create_parms)); // Note: this one has no error message in C when failure occurs? // clean up and return with success diff --git a/c++/test/tattr.cpp b/c++/test/tattr.cpp index d97d478..25b5ff8 100644 --- a/c++/test/tattr.cpp +++ b/c++/test/tattr.cpp @@ -653,7 +653,8 @@ static void test_attr_compound_read() verify_val((long)dims[1], (long)ATTR4_DIM2, "DataSpace::getSimpleExtentDims",__LINE__, __FILE__); // Get the class of the datatype that is used by attr - H5T_class_t type_class = attr.getTypeClass(); + H5T_class_t type_class; + type_class = attr.getTypeClass(); // Verify that the type is of compound datatype verify_val(type_class, H5T_COMPOUND, "Attribute::getTypeClass", __LINE__, __FILE__); @@ -1289,6 +1290,7 @@ static void test_attr_dtype_shared() // Retrieve and verify information about the type H5O_info_t oinfo; + dtype.getObjectInfo(TYPE1_NAME, &oinfo); fid1.getObjectInfo(TYPE1_NAME, &oinfo); if (oinfo.type != H5O_TYPE_NAMED_DATATYPE) TestErrPrintf("Line %d: object type wrong!\n", __LINE__); @@ -1402,6 +1404,14 @@ static void test_attr_dtype_shared() PASSED(); } // end try block + catch (DataTypeIException& E) + { + issue_fail_msg("test_attr_dtype_shared()", __LINE__, __FILE__, E.getCDetailMsg()); + } + catch (FileIException& E) + { + issue_fail_msg("test_attr_dtype_shared()", __LINE__, __FILE__, E.getCDetailMsg()); + } catch (Exception& E) { issue_fail_msg("test_attr_dtype_shared()", __LINE__, __FILE__, E.getCDetailMsg()); diff --git a/c++/test/tfile.cpp b/c++/test/tfile.cpp index 23cf280..d5278d5 100644 --- a/c++/test/tfile.cpp +++ b/c++/test/tfile.cpp @@ -497,15 +497,10 @@ static void test_file_name() comp_type.getFileName(); verify_val(file_name, FILE4, "CompType::getFileName", __LINE__, __FILE__); - /* file4.close(); -file4.openFile(FILE4, H5F_ACC_RDWR); - */ // Get the file's version information. H5F_info_t finfo; - file4.getFileInfo(finfo); // there's no C test for H5Fget_info - /* cerr << "file4: super_ext_size = " << finfo.super_ext_size << endl; - */ - //verify_val(finfo.sohm.hdr_size, 0, "H5File::getFileInfo", __LINE__, __FILE__); + file4.getFileInfo(finfo); + verify_val(finfo.sohm.hdr_size, 0, "H5File::getFileInfo", __LINE__, __FILE__); PASSED(); } // end of try block @@ -642,6 +637,11 @@ static void test_file_attribute() PASSED(); } // end of try block + // Catch creating existing attribute + catch (AttributeIException& E) + {} // do nothing, exception expected + + // Catch all other exceptions catch (Exception& E) { issue_fail_msg("test_file_attribute()", __LINE__, __FILE__, E.getCDetailMsg()); diff --git a/c++/test/tlinks.cpp b/c++/test/tlinks.cpp index b38ed39..356bc1b 100644 --- a/c++/test/tlinks.cpp +++ b/c++/test/tlinks.cpp @@ -326,11 +326,9 @@ static const char *FILENAME[] = { * Purpose: Test building a file with assorted links. * * Return: Success: 0 - * * Failure: -1 * - * Programmer: Binh-Minh Ribler - * October 16, 2009 + * October, 2009 * *------------------------------------------------------------------------- */ @@ -369,7 +367,6 @@ static void test_basic_links(hid_t fapl_id, hbool_t new_format) // Because these are not implemented in the C++ API yet, they are // used so CommonFG::getLinkval can be tested. - // Create a hard link if(H5Lcreate_hard( file_id, "dset1", H5L_SAME_LOC, "grp1/hard1", H5P_DEFAULT, H5P_DEFAULT) < 0) @@ -433,7 +430,7 @@ static void test_basic_links(hid_t fapl_id, hbool_t new_format) { issue_fail_msg("test_basic_links()", __LINE__, __FILE__, E.getCDetailMsg()); } -} +} // test_basic_links /*------------------------------------------------------------------------- * Function: test_num_links @@ -441,12 +438,9 @@ static void test_basic_links(hid_t fapl_id, hbool_t new_format) * Purpose: Test setting and getting limit of number of links * * Return: Success: 0 - * * Failure: -1 * - * Programmer: Binh-Minh Ribler - * Mar, 2017 - * + * March, 2017 *------------------------------------------------------------------------- */ static void test_num_links(hid_t fapl_id, hbool_t new_format) @@ -535,9 +529,12 @@ void test_links() test_basic_links(my_fapl_id, new_format); test_num_links(my_fapl_id, new_format); #if 0 + // these tests are from the C test links.c and left here for future // implementation of H5L API - nerrors += test_basic_links(fapl_id, new_format) < 0 ? 1 : 0; + test_move(my_fapl_id, new_format); + test_copy(my_fapl_id, new_format); + test_lcpl(my_fapl_id, new_format); nerrors += cklinks(my_fapl, new_format) < 0 ? 1 : 0; nerrors += new_links(my_fapl, new_format) < 0 ? 1 : 0; nerrors += ck_new_links(my_fapl, new_format) < 0 ? 1 : 0; @@ -545,9 +542,6 @@ void test_links() nerrors += toomany(my_fapl, new_format) < 0 ? 1 : 0; /* Test new H5L link creation routine */ - nerrors += test_lcpl(my_fapl, new_format); - nerrors += test_move(my_fapl, new_format); - nerrors += test_copy(my_fapl, new_format); nerrors += test_move_preserves(my_fapl, new_format); #ifndef H5_NO_DEPRECATED_SYMBOLS nerrors += test_deprec(my_fapl, new_format); diff --git a/c++/test/tobject.cpp b/c++/test/tobject.cpp index 54d62f2..b5e9ff0 100644 --- a/c++/test/tobject.cpp +++ b/c++/test/tobject.cpp @@ -73,6 +73,19 @@ static void test_get_objname() Group grp1_1 = grp1.createGroup(GROUP1_1, 0); Group grp1_2 = grp1.createGroup(GROUP1_2, 0); + // Attempted to create a same group to generate a failure, which should + // be caught with sub-class exception clause, if available. + try { + Group grp1_2 = grp1.createGroup(GROUP1_2, 0); + } + catch (GroupIException& E) + {} // do nothing, exception expected + catch (Exception& E) + { + cerr << "Exception should have been caught by the previous catch" << endl; + issue_fail_msg("test_get_objname", __LINE__, __FILE__); + } + // Get part of the group's name, random length using // ssize_t getObjName(char* comment, size_t buf_size) @@ -302,6 +315,7 @@ static void test_get_objtype() *------------------------------------------------------------------------- */ const H5std_string GROUPNAME("group"); +const H5std_string NOGROUPNAME("non-existent-group"); const H5std_string DTYPENAME("group/datatype"); const H5std_string DTYPENAME_INGRP("datatype"); const H5std_string DSETNAME("dataset"); @@ -323,22 +337,25 @@ static void test_open_object_header() // Create a group in the root group Group grp(file1.createGroup(GROUPNAME)); - grp.close(); // Commit the type inside the file IntType dtype(PredType::NATIVE_INT); dtype.commit(file1, DTYPENAME); dtype.close(); - // Create a new dataset + // Create a new dataset in the file dims[0] = DIM0; dims[1] = DIM1; DataSpace dspace(RANK, dims); DataSet dset(file1.createDataSet(DSETNAME, PredType::NATIVE_INT, dspace)); - // Close dataset and dataspace + // Create a dataset in the group + DataSet dsingrp(grp.createDataSet(DSET_IN_GRP1, PredType::NATIVE_INT, dspace)); + + // Close dataset, dataspace, and group dset.close(); dspace.close(); + grp.close(); // Now make sure that openObjId can open all three types of objects hid_t obj_grp = file1.openObjId(GROUPNAME); @@ -357,12 +374,12 @@ static void test_open_object_header() Group grp2(obj_grp); hsize_t num_objs = grp2.getNumObjs(); - verify_val(num_objs, 1, "H5Gget_info", __LINE__, __FILE__); - // There should be one object, the datatype + verify_val(num_objs, 2, "H5Gget_info", __LINE__, __FILE__); // Close datatype object opened from the file H5Location::closeObjId(obj_dtype); + // Do a few things using the dset object identifier dset.setId(obj_dset); dspace = dset.getSpace(); bool is_simple = dspace.isSimple(); @@ -371,6 +388,7 @@ static void test_open_object_header() // Open datatype object from the group obj_dtype = grp2.openObjId(DTYPENAME_INGRP); + // Do a few things using the datatype object identifier dtype.setId(obj_dtype); H5T_class_t type_class = dtype.getClass(); verify_val(type_class, H5T_INTEGER, "H5Tget_class", __LINE__, __FILE__); @@ -384,11 +402,24 @@ static void test_open_object_header() // Try doing something with group, the ID should still work num_objs = grp2.getNumObjs(); - verify_val(num_objs, 1, "H5Gget_info", __LINE__, __FILE__); + verify_val(num_objs, 2, "H5Gget_info", __LINE__, __FILE__); // Close the cloned group grp2.close(); + // Attempted to open a non-existing group, which should + // be caught with sub-class exception clause, if available. + try { + Group grp3 = dsingrp.openObjId(NOGROUPNAME); + } + catch (DataSetIException& E) + {} // do nothing, exception expected and caught correctly + catch (Exception& E) + { + cerr << "Exception should have been caught by the previous catch" << endl; + issue_fail_msg("test_get_objname", __LINE__, __FILE__); + } + PASSED(); } // end of try block // catch invalid action exception @@ -401,7 +432,6 @@ static void test_open_object_header() // catch all other exceptions catch (Exception& E) { - cerr << " in Exception" << endl; issue_fail_msg("test_file_name()", __LINE__, __FILE__, E.getCDetailMsg()); } } /* test_open_object_header() */ @@ -454,7 +484,6 @@ static void test_is_valid() // catch all other exceptions catch (Exception& E) { - cerr << " in catch " << endl; issue_fail_msg("test_get_objtype", __LINE__, __FILE__, E.getCDetailMsg()); } } // test_is_valid |