@@ -18,6 +18,8 @@ Author: Daniel Kroening, kroening@kroening.com
18
18
#include < solvers/prop/prop.h>
19
19
#include < solvers/prop/literal_expr.h>
20
20
#include < solvers/flattening/bv_conversion_exceptions.h>
21
+ #include < util/string_utils.h>
22
+ #include < util/suffix.h>
21
23
22
24
#include " goto_symex_state.h"
23
25
#include " equation_conversion_exceptions.h"
@@ -722,24 +724,40 @@ void symex_target_equationt::SSA_stept::output(
722
724
out << " Guard: " << from_expr (ns, " " , guard) << ' \n ' ;
723
725
}
724
726
725
- std::string
726
- unwrap_exception (const std::exception &e, int level, std::string message)
727
+ // / Given a potentially nested exception, produce a string with all of nested
728
+ // / exceptions information. If a nested exception string contains new lines
729
+ // / then the newlines are indented to the correct level.
730
+ // / \param e: The outer exeception
731
+ // / \param level: How many exceptions have already been unrolled
732
+ // / \return A string with all nested exceptions printed and indented
733
+ std::string unwrap_exception (const std::exception &e, int level)
727
734
{
728
- // messaget message(get_message_handler());
729
- // message.error().source_location=symex.last_source_location;
730
- // message.error() << error_str << messaget::eom;
731
- message += std::string (level, ' ' ) + " exception: " + e.what () + " \n " ;
735
+ const std::string msg = e.what ();
736
+ std::vector<std::string> lines;
737
+ split_string (msg, ' \n ' , lines, false , true );
738
+ std::ostringstream message_stream;
739
+ message_stream << std::string (level, ' ' ) << " exception: " ;
740
+ join_strings (
741
+ message_stream, lines.begin (), lines.end (), " \n " + std::string (level, ' ' ));
742
+
732
743
try
733
744
{
734
745
std::rethrow_if_nested (e);
735
746
}
736
747
catch (const std::exception &e)
737
748
{
738
- unwrap_exception (e, level + 1 , message);
749
+ std::string nested_message = unwrap_exception (e, level + 1 );
750
+ // Some exception messages already end in a new line (e.g. as they have
751
+ // dumped an irept. Most do not so add a new line on.
752
+ if (!has_suffix (nested_message, " \n " ))
753
+ {
754
+ message_stream << ' \n ' ;
755
+ }
756
+ message_stream << nested_message;
739
757
}
740
758
catch (...)
741
759
{
742
760
UNREACHABLE;
743
761
}
744
- return message ;
762
+ return message_stream. str () ;
745
763
}
0 commit comments