diff --git a/CMakeLists.txt b/CMakeLists.txt
index c2bf9693562f853986f4e4b4b5eacff289ee2d3e..9a5f158b2c6fa9e559652871a534edf5a4256379 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -130,13 +130,11 @@ if(ENABLE_EXPERIMENTAL_SCREENFITTER)
   endif()
 endif()
 
-# Casacore depends on HDF5 -> First load HDF5.
+# Load HDF5 before Casacore, since some Casacore versions do not load HDF5.
 find_package(
   HDF5
   COMPONENTS C CXX
   REQUIRED)
-add_definitions(${HDF5_DEFINITIONS})
-include_directories(${HDF5_INCLUDE_DIRS})
 
 find_package(
   Casacore
@@ -144,6 +142,15 @@ find_package(
   REQUIRED)
 include_directories(SYSTEM ${CASACORE_INCLUDE_DIR})
 
+# Reload HDF5, since some Casacore versions also load HDF5, but without C++
+# support. ${HDF5_LIBRARIES} then does not include C++ libraries.
+find_package(
+  HDF5
+  COMPONENTS C CXX
+  REQUIRED)
+add_definitions(${HDF5_DEFINITIONS})
+include_directories(${HDF5_INCLUDE_DIRS})
+
 find_package(CFITSIO REQUIRED)
 include_directories(${CFITSIO_INCLUDE_DIRS})
 
@@ -562,7 +569,7 @@ set(SOURCEDB_LIBRARIES Blob Common ParmDB ${CASACORE_LIBRARIES}
                        ${Boost_SYSTEM_LIBRARY})
 
 add_executable(DP3 base/Main.cc)
-target_link_libraries(DP3 LIBDP3)
+target_link_libraries(DP3 LIBDP3 ${HDF5_LIBRARIES})
 
 add_executable(makesourcedb parmdb/makesourcedb.cc)
 target_link_libraries(makesourcedb ${SOURCEDB_LIBRARIES})
diff --git a/base/Main.cc b/base/Main.cc
index dc676866167bf9990b895d66fb0c9d89443a8a21..1e4b7bedf6ebc09d6b9598299392068a9903c362 100644
--- a/base/Main.cc
+++ b/base/Main.cc
@@ -4,15 +4,17 @@
 //
 // @author Ger van Diepen
 
-#include <dp3/base/DP3.h>
+#include <filesystem>
+#include <iostream>
+#include <stdexcept>
 
-#include <Version.h>
+#include <H5Cpp.h>
 
 #include <aocommon/checkblas.h>
 
-#include <filesystem>
-#include <iostream>
-#include <stdexcept>
+#include <dp3/base/DP3.h>
+
+#include <Version.h>
 
 // Define handler that tries to print a backtrace.
 // Exception::TerminateHandler t(Exception::terminate);
@@ -70,9 +72,17 @@ int main(int argc, char* argv[]) {
 
     // Execute the parset file.
     dp3::base::Execute(parsetName, argc, argv);
-  } catch (std::exception& err) {
+  } catch (const std::exception& err) {
     std::cerr << "\nstd exception detected: " << err.what() << '\n';
     return 1;
+  } catch (const H5::Exception& err) {
+    // Since H5::Exception is not derived from std::exception, DP3 crashes
+    // if it does not catch them -> Print an error message instead.
+    std::cerr << "\nH5 exception detected: " << err.getDetailMsg()
+              << "\nStack trace:\n";
+    err.printErrorStack();
+    std::cerr << '\n';
+    return 1;
   }
   return 0;
 }