]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Some cleanups.
authorWolfgang Bangerth <bangerth@math.tamu.edu>
Sun, 22 Mar 2015 16:04:20 +0000 (11:04 -0500)
committerWolfgang Bangerth <bangerth@math.tamu.edu>
Tue, 24 Mar 2015 12:32:14 +0000 (07:32 -0500)
Avoid code duplication and use the much better tested conversion functions in
namespace Utilities. This also covers a number of corner cases that likely
didn't work before.

Also provide more information in exceptions.

include/deal.II/base/parameter_handler.h
source/base/parameter_handler.cc
tests/bits/parameter_handler_17.cc

index 68ed0b91b2ce6631a79fdece0e8122b08c7160fe..55b9e56ca27b9caf217dcaab169731255f3906fd 100644 (file)
@@ -1648,7 +1648,7 @@ public:
                       const std::string           &documentation = std::string());
 
   /**
-   * Enter a subsection; if not yet existent, declare it.
+   * Enter a subsection. If it does not yet exist, create it.
    */
   void enter_subsection (const std::string &subsection);
 
@@ -1887,12 +1887,6 @@ public:
   DeclException1 (ExcEntryUndeclared,
                   std::string,
                   << "You can't ask for entry <" << arg1 << "> you have not yet declared");
-  /**
-   * Exception
-   */
-  DeclException1 (ExcConversionError,
-                  std::string,
-                  << "Error when trying to convert the following string: " << arg1);
   //@}
 private:
   /**
index 03f3f35adbc09ed0a0c18c96e3742aa173883900..7144a4106594a71c8a3ea03dd4d5c84d3737e2f8 100644 (file)
@@ -1656,47 +1656,55 @@ ParameterHandler::get (const std::string &entry_string) const
 
 long int ParameterHandler::get_integer (const std::string &entry_string) const
 {
-  std::string s = get (entry_string);
-  char *endptr;
-  const long int i = std::strtol (s.c_str(), &endptr, 10);
-
-  // assert that there was no error. an error would be if
-  // either there was no string to begin with, or if
-  // strtol set the endptr to anything but the end of
-  // the string
-  AssertThrow ((s.size()>0) && (*endptr == '\0'),
-               ExcConversionError(s));
-
-  return i;
+  try
+    {
+      return Utilities::string_to_int (get (entry_string));
+    }
+  catch (...)
+    {
+      AssertThrow (false,
+                   ExcMessage("Can't convert the parameter value <"
+                              + get(entry_string) +
+                              "> for entry <"
+                              + entry_string +
+                              " to an integer."));
+      return 0;
+    }
 }
 
 
 
 double ParameterHandler::get_double (const std::string &entry_string) const
 {
-  std::string s = get (entry_string);
-  char *endptr;
-  double d = std::strtod (s.c_str(), &endptr);
-
-  // assert that there was no error. an error would be if
-  // either there was no string to begin with, or if
-  // strtol set the endptr to anything but the end of
-  // the string
-  AssertThrow ((s.size()>0) && (*endptr == '\0'),
-               ExcConversionError(s));
-
-  return d;
+  try
+    {
+      return Utilities::string_to_double (get (entry_string));
+    }
+  catch (...)
+    {
+      AssertThrow (false,
+                   ExcMessage("Can't convert the parameter value <"
+                              + get(entry_string) +
+                              "> for entry <"
+                              + entry_string +
+                              " to a double precision variable."));
+      return 0;
+    }
 }
 
 
 
 bool ParameterHandler::get_bool (const std::string &entry_string) const
 {
-  std::string s = get(entry_string);
+  const std::string s = get(entry_string);
 
   AssertThrow ((s=="true") || (s=="false") ||
                (s=="yes") || (s=="no"),
-               ExcConversionError(s));
+               ExcMessage("Can't convert the parameter value <"
+                          + get(entry_string) +
+                          "> for entry <"
+                          + entry_string +
+                          " to a boolean."));
   if (s=="true" || s=="yes")
     return true;
   else
index 99efd0853eb35431f58ea6573600d740f32d3043..cabd0996c6998263ba653a7892a8d1c211e3d591 100644 (file)
@@ -1,6 +1,6 @@
 // ---------------------------------------------------------------------
 //
-// Copyright (C) 2002 - 2014 by the deal.II authors
+// Copyright (C) 2002 - 2015 by the deal.II authors
 //
 // This file is part of the deal.II library.
 //
@@ -34,7 +34,7 @@ void check ()
     {
       prm.get_double ("a");
     }
-  catch (const ParameterHandler::ExcConversionError &)
+  catch (...)
     {
       deallog << "get_double() detected the mistake" << std::endl;
     }
@@ -43,7 +43,7 @@ void check ()
     {
       prm.get_integer ("a");
     }
-  catch (const ParameterHandler::ExcConversionError &)
+  catch (...)
     {
       deallog << "get_integer() detected the mistake" << std::endl;
     }
@@ -52,7 +52,7 @@ void check ()
     {
       prm.get_bool ("a");
     }
-  catch (const ParameterHandler::ExcConversionError &)
+  catch (...)
     {
       deallog << "get_bool() detected the mistake" << std::endl;
     }

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.