diff --git a/Framework/Beamline/src/DetectorInfo.cpp b/Framework/Beamline/src/DetectorInfo.cpp
index 20d463010832dabfa5d218457afe083b12d8d253..efb95ad9b880a85dd0c30e7182fd91ac73c031aa 100644
--- a/Framework/Beamline/src/DetectorInfo.cpp
+++ b/Framework/Beamline/src/DetectorInfo.cpp
@@ -204,7 +204,7 @@ void DetectorInfo::setScanInterval(
     initScanIntervals();
   if (interval.first >= interval.second)
     throw std::runtime_error(
-        "DetectorInfo: cannot set scan interval with start > end");
+        "DetectorInfo: cannot set scan interval with start >= end");
   m_scanIntervals.access()[index] = interval;
 }
 
diff --git a/Framework/Beamline/test/DetectorInfoTest.h b/Framework/Beamline/test/DetectorInfoTest.h
index 9ca8a7d4ea500f996066d3510b69c7fe7f65e28a..418746bc99cd44a411aa804c919566e2e5f5e26b 100644
--- a/Framework/Beamline/test/DetectorInfoTest.h
+++ b/Framework/Beamline/test/DetectorInfoTest.h
@@ -275,8 +275,14 @@ public:
 
   void test_setScanInterval_failures() {
     DetectorInfo info(PosVec(1), RotVec(1));
-    TS_ASSERT_THROWS(info.setScanInterval(0, {1, 1}), std::runtime_error);
-    TS_ASSERT_THROWS(info.setScanInterval(0, {2, 1}), std::runtime_error);
+    TS_ASSERT_THROWS_EQUALS(
+        info.setScanInterval(0, {1, 1}), const std::runtime_error &e,
+        std::string(e.what()),
+        "DetectorInfo: cannot set scan interval with start >= end");
+    TS_ASSERT_THROWS_EQUALS(
+        info.setScanInterval(0, {2, 1}), const std::runtime_error &e,
+        std::string(e.what()),
+        "DetectorInfo: cannot set scan interval with start >= end");
   }
 
   void test_merge_fail_size() {
@@ -285,18 +291,26 @@ public:
     a.setScanInterval(0, {0, 1});
     b.setScanInterval(0, {0, 1});
     b.setScanInterval(1, {0, 1});
-    TS_ASSERT_THROWS(a.merge(b), std::runtime_error);
+    TS_ASSERT_THROWS_EQUALS(a.merge(b), const std::runtime_error &e,
+                            std::string(e.what()),
+                            "Cannot merge DetectorInfo: size mismatch");
   }
 
   void test_merge_fail_no_intervals() {
     DetectorInfo a(PosVec(1), RotVec(1));
     DetectorInfo b(PosVec(1), RotVec(1));
     DetectorInfo c(PosVec(1), RotVec(1));
-    TS_ASSERT_THROWS(a.merge(b), std::runtime_error);
+    TS_ASSERT_THROWS_EQUALS(
+        a.merge(b), const std::runtime_error &e, std::string(e.what()),
+        "Cannot merge DetectorInfo: scan intervals not defined");
     c.setScanInterval(0, {0, 1});
-    TS_ASSERT_THROWS(a.merge(c), std::runtime_error);
+    TS_ASSERT_THROWS_EQUALS(
+        a.merge(c), const std::runtime_error &e, std::string(e.what()),
+        "Cannot merge DetectorInfo: scan intervals not defined");
     a.setScanInterval(0, {0, 1});
-    TS_ASSERT_THROWS(a.merge(b), std::runtime_error);
+    TS_ASSERT_THROWS_EQUALS(
+        a.merge(b), const std::runtime_error &e, std::string(e.what()),
+        "Cannot merge DetectorInfo: scan intervals not defined");
   }
 
   void test_merge_fail_monitor_mismatch() {
@@ -306,7 +320,9 @@ public:
     a.setScanInterval(1, {0, 1});
     b.setScanInterval(0, {0, 1});
     b.setScanInterval(1, {0, 1});
-    TS_ASSERT_THROWS(a.merge(b), std::runtime_error);
+    TS_ASSERT_THROWS_EQUALS(
+        a.merge(b), const std::runtime_error &e, std::string(e.what()),
+        "Cannot merge DetectorInfo: monitor flags mismatch");
   }
 
   void test_merge_identical_interval_failures() {
@@ -326,19 +342,28 @@ public:
 
     b = a;
     b.setMasked(0, false);
-    TS_ASSERT_THROWS(b.merge(a), std::runtime_error);
+    TS_ASSERT_THROWS_EQUALS(b.merge(a), const std::runtime_error &e,
+                            std::string(e.what()), "Cannot merge DetectorInfo: "
+                                                   "matching scan interval but "
+                                                   "mask flags differ");
     b.setMasked(0, true);
     TS_ASSERT_THROWS_NOTHING(b.merge(a));
 
     b = a;
     b.setPosition(0, pos2);
-    TS_ASSERT_THROWS(b.merge(a), std::runtime_error);
+    TS_ASSERT_THROWS_EQUALS(b.merge(a), const std::runtime_error &e,
+                            std::string(e.what()), "Cannot merge DetectorInfo: "
+                                                   "matching scan interval but "
+                                                   "positions differ");
     b.setPosition(0, pos1);
     TS_ASSERT_THROWS_NOTHING(b.merge(a));
 
     b = a;
     b.setRotation(0, rot2);
-    TS_ASSERT_THROWS(b.merge(a), std::runtime_error);
+    TS_ASSERT_THROWS_EQUALS(b.merge(a), const std::runtime_error &e,
+                            std::string(e.what()), "Cannot merge DetectorInfo: "
+                                                   "matching scan interval but "
+                                                   "rotations differ");
     b.setRotation(0, rot1);
     TS_ASSERT_THROWS_NOTHING(b.merge(a));
   }
@@ -368,11 +393,17 @@ public:
     TS_ASSERT_THROWS_NOTHING(b.merge(a));
     b = a;
     b.setScanInterval(1, {-1, 5});
-    TS_ASSERT_THROWS(b.merge(a), std::runtime_error);
+    TS_ASSERT_THROWS_EQUALS(
+        b.merge(a), const std::runtime_error &e, std::string(e.what()),
+        "Cannot merge DetectorInfo: scan intervals overlap but not identical");
     b.setScanInterval(1, {1, 5});
-    TS_ASSERT_THROWS(b.merge(a), std::runtime_error);
+    TS_ASSERT_THROWS_EQUALS(
+        b.merge(a), const std::runtime_error &e, std::string(e.what()),
+        "Cannot merge DetectorInfo: scan intervals overlap but not identical");
     b.setScanInterval(1, {1, 11});
-    TS_ASSERT_THROWS(b.merge(a), std::runtime_error);
+    TS_ASSERT_THROWS_EQUALS(
+        b.merge(a), const std::runtime_error &e, std::string(e.what()),
+        "Cannot merge DetectorInfo: scan intervals overlap but not identical");
   }
 
   void test_merge() {