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