我一直在尝试想出一种方法来解决 HDF5 C++ 绑定的一些缺点。目前,我的代码中充斥着类似于以下内容的 try/catch 块:
H5::Exception::dontPrint();
H5::H5File *file = NULL;
try {
file = new H5::H5File(fname.c_str(), H5F_ACC_RDWR);
} catch(H5::FileIException &file_exists_err) {
file = new H5::H5File(fname.c_str(), H5F_ACC_TRUNC);
}
这不应该是必要的——我想做的就是打开一个文件进行读/写访问,如果它不存在,就创建它。另一个更棘手的问题是创建一个嵌套组(例如“/parent/group”),其中父组不一定存在。在 Unix/Linux 中,等价于
mkdir -p parent/group
但是,在 HDF5 C++ 绑定中,创建其父组不存在的组会引发异常。
由于这些原因,我一直有动力创建一个头文件来处理其中一些常见问题。我的第一个想法是简单地创建一组函数,例如,获取文件名和访问模式并返回 H5::H5File 对象,或者获取组名并返回组对象。但是,我认为这不太理想,因为它使使用此头文件的程序员对返回的对象调用“删除”,即使程序员从未在自己的代码中明确调用“新”。这似乎是在要求内存泄漏。
因此,我的第二个想法是从 H5::H5File 和 H5::H5Group 创建一组派生类,其构造函数在文件尚不存在或组的父组尚不存在时不会引发异常. 我对派生文件类的尝试如下:
namespace H5Utils {
class H5File : public H5::H5File {
public:
H5File(std::string fname);
~H5File();
};
}
H5Utils::H5File::H5File(std::string fname)
try : H5::H5File(fname.c_str(), H5F_ACC_RDWR)
{
std::cerr << "Opened existing file." << std::endl;
} catch(H5::FileIException &file_exists_err) {
std::cerr << "File does not exist. Creating new file." << std::endl;
H5::H5File(fname.c_str(), H5F_ACC_TRUNC);
}
H5Utils::H5File::~H5File() { }
我遇到的问题是双重的。首先,构造函数中的 try/catch 块重新抛出由
H5::H5File(fname.c_str(), H5F_ACC_RDWR)
当文件不存在时,程序仍然终止。第二个问题是我不确定第二个构造函数,
H5::H5File(fname.c_str(), H5F_ACC_TRUNC);
是正确的(即它是否构造父类?)有没有办法让派生类在基类的构造函数中捕获异常,然后为基类调用不同的构造函数?
更一般地说,谁能想到更好/更优雅的方式来处理 HDF5 C++ 绑定的这些缺点?