From 4c30c61dc05b1660b5e505ebbe5c77e7e73a79e2 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 12 Jul 2018 14:13:45 -0500 Subject: [PATCH] Better error message for missing dataset/group --- src/hdf5_interface.cpp | 37 +++++++++++++++++++++++++++---------- src/hdf5_interface.h | 4 +++- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/hdf5_interface.cpp b/src/hdf5_interface.cpp index db4dab96c5..5d6926479c 100644 --- a/src/hdf5_interface.cpp +++ b/src/hdf5_interface.cpp @@ -145,6 +145,18 @@ dataset_typesize(hid_t dset) } +void +ensure_exists(hid_t group_id, const char* name) +{ + if (!object_exists(group_id, name)) { + std::stringstream err_msg; + err_msg << "Object \"" << name << "\" does not exist in group " + << object_name(group_id); + fatal_error(err_msg); + } +} + + hid_t file_open(const char* filename, char mode, bool parallel) { @@ -358,14 +370,23 @@ object_exists(hid_t object_id, const char* name) } +std::string +object_name(hid_t obj_id) +{ + // Determine size and create buffer + size_t size = 1 + H5Iget_name(obj_id, nullptr, 0); + char buffer[size]; + + // Read and return name + H5Iget_name(obj_id, buffer, size); + return {buffer, size}; +} + + hid_t open_dataset(hid_t group_id, const char* name) { - if (!object_exists(group_id, name)) { - std::stringstream err_msg; - err_msg << "Group \"" << name << "\" does not exist"; - fatal_error(err_msg); - } + ensure_exists(group_id, name); return H5Dopen(group_id, name, H5P_DEFAULT); } @@ -373,11 +394,7 @@ open_dataset(hid_t group_id, const char* name) hid_t open_group(hid_t group_id, const char* name) { - if (!object_exists(group_id, name)) { - std::stringstream err_msg; - err_msg << "Group \"" << name << "\" does not exist"; - fatal_error(err_msg); - } + ensure_exists(group_id, name); return H5Gopen(group_id, name, H5P_DEFAULT); } diff --git a/src/hdf5_interface.h b/src/hdf5_interface.h index cd60568617..c859f221af 100644 --- a/src/hdf5_interface.h +++ b/src/hdf5_interface.h @@ -74,8 +74,10 @@ read_nd_vector(hid_t obj_id, const char* name, bool must_have = false); std::vector attribute_shape(hid_t obj_id, const char* name); -std::vector object_shape(hid_t obj_id); +void ensure_exists(hid_t group_id, const char* name); std::vector group_names(hid_t group_id); +std::vector object_shape(hid_t obj_id); +std::string object_name(hid_t obj_id); //============================================================================== // Fortran compatibility functions