changeset 907:5e256614c376

Make more use of exceptions and don't set error_state ourselves. * connectivity.cc, connectivity.h: define new invalid_conversion exception class so we don't have to set and reset error_state ourselves. This was causing weird bugs where some errors were printed but could not caught in the Octave interpreter.
author Carnë Draug <carandraug@octave.org>
date Thu, 30 Oct 2014 22:10:00 +0000
parents 475a5a2a08cb
children f53cc3aaa88e
files src/connectivity.cc src/connectivity.h
diffstat 2 files changed, 19 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/src/connectivity.cc
+++ b/src/connectivity.cc
@@ -26,23 +26,19 @@
 connectivity::connectivity (const octave_value& val)
 {
   try
+    {ctor (double_value (val));}
+  catch (invalid_conversion& e)
     {
-      const double conn = double_value (val);
-      if (error_state)
-          throw invalid_connectivity ("must be in [4 6 8 18 26]");
-      ctor (conn);
-    }
-  catch (invalid_connectivity& e)
-    {
-      const boolNDArray mask = bool_array_value (val);
-      if (error_state)
-        throw invalid_connectivity ("must be logical or in [4 6 8 18 26]");
-      ctor (mask);
+      try
+        {ctor (bool_array_value (val));}
+      catch (invalid_connectivity& e)
+        {throw;} // so it does not get caught by the parent invalid_conversion
+      catch (invalid_conversion& e)
+        {throw invalid_connectivity ("must be logical or in [4 6 8 18 26]");}
     }
   return;
 }
 
-
 connectivity::connectivity (const boolNDArray& mask)
 {
   ctor (mask);
@@ -217,24 +213,22 @@
 double
 connectivity::double_value (const octave_value& val)
 {
-  error_state = 0;
   const double conn = val.double_value ();
   // Check is_scalar_type because the warning Octave:array-to-scalar
   // is off by default and we will get the first element only.
   if (error_state || ! val.is_scalar_type ())
-    error_state = 1;
+    throw invalid_conversion ("no conversion to double value");
   return conn;
 }
 
 boolNDArray
 connectivity::bool_array_value (const octave_value& val)
 {
-  error_state = 0;
   const boolNDArray mask = val.bool_array_value ();
   // bool_array_value converts anything other than 0 to true, which will
   // then validate as conn array, hence any_element_not_one_or_zero()
   if (val.array_value ().any_element_not_one_or_zero ())
-    error_state = 1;
+    throw invalid_conversion ("no conversion to bool array value");
   return mask;
 }
 
--- a/src/connectivity.h
+++ b/src/connectivity.h
@@ -54,11 +54,18 @@
         static boolNDArray bool_array_value (const octave_value& val);
     };
 
-    class invalid_connectivity : public std::invalid_argument
+    class invalid_conversion : public std::invalid_argument
+    {
+      public:
+        invalid_conversion (const std::string& what_arg)
+          : std::invalid_argument (what_arg) { }
+    };
+
+    class invalid_connectivity : public octave::image::invalid_conversion
     {
       public:
         invalid_connectivity (const std::string& what_arg)
-          : std::invalid_argument (what_arg) { }
+          : octave::image::invalid_conversion (what_arg) { }
     };
   }
 }