3

I would like to add information on what the program was about to do to my exception handling. The old code had one big try-block around everything:

try {
  read_cfg();  // a sub call might throw runtime_error
  operation1();
  operation2();
}
catch (std::exception& e) {
  std::cerr
    << "Error: " << e.what() << ", "
    // FIXME: also show what we were trying to do
    // FIXME: and what a user could try
    << "\n";
}

Example error message:

Error: file "foo.cfg" not found, while reading configuration.
Please make sure the file exists.

I converted the try-block into three blocks, but this feels odd:

try {
  read_cfg();  // a sub call might throw runtime_error
}
catch (std::exception& e) {
  std::cerr
    << "Error: " << e.what() << ", "
    << "while reading configuration."
    << "\n";
}
try {
  operation1();
}
catch (std::exception& e) {
  std::cerr
    << "Error: " << e.what() << ", "
    << "while performing operation 1."
    << "\n";
}
try {
  operation2();
}
catch (std::exception& e) {
  std::cerr
    << "Error: " << e.what() << ", "
    << "while performing operation 2."
    << "\n";
}

I also tried to introduce one exception class per call (read_cfg_exception, operation1_exception, operation2_exception). Since in read_cfg() the call to open might throw, I catch its exception and convert it to a read_cfg_exception, thereby saving the additional information, that something whent wrong "while reading configuration". Yet this does not feel right either:

class read_cfg_exception;
void open(std::string name); // might throw std::runtime_error

void read_cfg()
{
  try {
    open("foo.cfg");
  }
  catch (std::runtime_error& e) {
    throw read_cfg_exception(e.what() + "while reading configuration");
  }
}

Therefor I have the question: What is a good pattern to show the additional information of what the program was doing while the error occured.

Micha Wiedenmann
  • 19,979
  • 21
  • 92
  • 137

1 Answers1

0

take a look at POCO (c++ library) throwing system, that should answer all your questions, you'll learn a lot from that and many good style rules too. The answare to your question will be really long unfortunately (at least I don't know how to make it short).

Anyway don't implement something that makes your code not readable, in your example code is not readable and then not maintainable wich is not wanted.

CoffeDeveloper
  • 7,961
  • 3
  • 35
  • 69