]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Tighten up error messages. 3189/head
authorWolfgang Bangerth <bangerth@colostate.edu>
Tue, 4 Oct 2016 19:57:04 +0000 (13:57 -0600)
committerWolfgang Bangerth <bangerth@colostate.edu>
Tue, 4 Oct 2016 19:57:04 +0000 (13:57 -0600)
It has long annoyed me that when we print exception messages that were created
via ExcMessage, that the information is really duplicative. Example:

--------------------------------------------------------
An error occurred in line <710> of file <.../step-6.cc> in function
    int main()
The violated condition was:
    false
The name and call sequence of the exception was:
    ExcMessage ("abc" "def")
Additional Information:
abcdef

Stacktrace:
-----------
#0  ./step-6: main
--------------------------------------------------------

Here, the text that comes after 'The name and call sequence...'
is duplicative with what comes after 'Additional Information:'.

This is specifically the case for ExcMessage errors because
there *everything* that constructs the 'Additional information'
will actually be also under 'The name and...' part.

This patch cleans this up by omitting the first of these two
parts if the error message was created via ExcMessage.

source/base/exceptions.cc

index 708494b2ebda4272b9234cc694f39f8408d00959..685623b2ed945d514d17023d5e30f22c62ddb783 100644 (file)
@@ -148,15 +148,32 @@ const char *ExceptionBase::get_exc_name () const
 
 void ExceptionBase::print_exc_data (std::ostream &out) const
 {
+  // print a header for the exception
   out << "An error occurred in line <" << line
       << "> of file <" << file
       << "> in function" << std::endl
       << "    " << function << std::endl
       << "The violated condition was: "<< std::endl
-      << "    " << cond << std::endl
-      << "The name and call sequence of the exception was:" << std::endl
-      << "    " << exc  << std::endl
-      << "Additional Information: " << std::endl;
+      << "    " << cond << std::endl;
+
+  // print the way the additional information message was generated.
+  // this is useful if the names of local variables appear in the
+  // generation of the error message, because it allows the identification
+  // of parts of the error text with what variables may have cause this
+  //
+  // On the other hand, this is almost never the case for ExcMessage
+  // exceptions which would simply print the same text twice: once for
+  // the way the message was composed, and once for the additional
+  // information. Furthermore, the former of these two is often spread
+  // between numerous "..."-enclosed strings that the preprocessor
+  // collates into a single string, making it awkward to read. Consequently,
+  // elide this text if the message was generated via an ExcMessage object
+  if (std::strstr(cond, "dealii::ExcMessage") != NULL)
+    out << "The name and call sequence of the exception was:" << std::endl
+        << "    " << exc  << std::endl;
+
+  // finally print the additional information the exception provides:
+  out << "Additional Information: " << 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.