diff options
author | Chris Johns <chrisj@rtems.org> | 2018-05-08 15:09:46 +1000 |
---|---|---|
committer | Chris Johns <chrisj@rtems.org> | 2018-06-18 12:26:16 +1000 |
commit | b73f905e3aa0e9ac16eb19f956ff3297d92fe48f (patch) | |
tree | 76d30bff1fbb0d2cd316874a27d000c6947138bc /rtemstoolkit/rld-files.cpp | |
parent | f7d303f104626e512bfe84ba0695b309dd542d19 (diff) |
rtemstoolkit/elf,files: Catch exceptions in destructors.
Catch exceptions in destructures and print a message to avoid
an unhandled exception happening in an exception stack unwind.
Diffstat (limited to 'rtemstoolkit/rld-files.cpp')
-rw-r--r-- | rtemstoolkit/rld-files.cpp | 72 |
1 files changed, 66 insertions, 6 deletions
diff --git a/rtemstoolkit/rld-files.cpp b/rtemstoolkit/rld-files.cpp index fdf12a6..f26aeec 100644 --- a/rtemstoolkit/rld-files.cpp +++ b/rtemstoolkit/rld-files.cpp @@ -256,10 +256,12 @@ namespace rld image::~image () { if (references_) - std::cerr << "rtl:file:image: references when destructing"; + std::cerr << "rtl:file:image: references when destructing" << std::endl; + if (fd_ >= 0) { ::close (fd_); + fd_= -1; if (writable && remove) { if (rld::verbose () >= RLD_VERBOSE_INFO) @@ -268,6 +270,22 @@ namespace rld ::unlink (name_.path ().c_str ()); } } + + try + { + elf_.end (); + } + catch (rld::error re) + { + std::cerr << "error: rld::files::image:::~image: " + << re.where << ": " << re.what + << std::endl; + } + catch (...) + { + std::cerr << "error: rld::files::image:::~image: unhandled exception" + << std::endl; + } } void @@ -537,8 +555,22 @@ namespace rld archive::~archive () { - end (); - close (); + try + { + end (); + close (); + } + catch (rld::error re) + { + std::cerr << "error: rld::files::archive::~archive: " + << re.where << ": " << re.what + << std::endl; + } + catch (...) + { + std::cerr << "error: rld::files::archive::~archive: unhandled exception" + << std::endl; + } } void @@ -960,8 +992,22 @@ namespace rld object::~object () { - end (); - close (); + try + { + end (); + close (); + } + catch (rld::error re) + { + std::cerr << "error: rld::files::object::~object: " + << re.where << ": " << re.what + << std::endl; + } + catch (...) + { + std::cerr << "error: rld::files::object::~object: unhandled exception" + << std::endl; + } } void @@ -1318,7 +1364,21 @@ namespace rld cache::~cache () { - close (); + try + { + close (); + } + catch (rld::error re) + { + std::cerr << "error: rld::files:cache::~cache: " + << re.where << ": " << re.what + << std::endl; + } + catch (...) + { + std::cerr << "error: rld::files::cache::~cache: unhandled exception" + << std::endl; + } } void |