$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Oleg Abrosimov (beholder_at_[hidden])
Date: 2006-07-19 00:36:14
Finally, with a help of "Exception Visitor" thread I've understood the
problem I've tried to spot in my previous message.
In current C++ language exception handling is defined with well
structured exception hierarchies in mind. In this case exception
handling is simple: catch(base_exception& e) and be happy.
The problem arises when one have to handle many unrelated exceptions
that do not correspond to single hierarchy or even in a rare case where
one needs to provide different responses for different exceptions in the
same hierarchy.
The first is common on subsystem boundaries like C++ - C or C++ - GUI
event handlers.
In the thread mentioned above two basic workarounds were described that
helps to deal with a problem of many unrelated exception handling, but I
believe that it can be elegantly solved on a language level. All we need
is just allow the following:
class A {};
class B {
public :
B(A const& a);
};
void foo()
try {
throw A;
} catch (B& b) {
//caught
}
The idea behind it is simple: if A was thrown and B can be constructed
from it then the catch(B& b) handler is called.
With this extension one can do the following:
typedef boost::variant< int, std::string > my_exception;
class my_exception_visitor
: public boost::static_visitor<>
{
public:
void operator()(int & i) const
{
//...
}
void operator()(std::string & str) const
{
//...
}
};
void foo()
try {
if(...) throw 1;
else throw std::string("Hello world!");
} catch (my_exception& e) {
boost::apply_visitor( my_exception_visitor(), e );
}
for filesystem it means that it can use uniform "exception handling"
even without exceptions at all. versions of functions with error_code
could be replaced with templates that can accept any visitor instead of
error_code. It would be a high-level, type-safe, reusable and
maintainable way to handle system-level errors.
I'll post this idea to comp.std.c++ in a hope of it's adoption by
community. But in the meantime my request to you as a filesystem and
system_error developer is to use type-safe visitor approach instead of
error_code. It means that you'll need to define a separate error type
for each low-level error on each supported platform. Yes, it can be very
annoying, but it should be done only one time. (it can be extended if
the underling system error-set would be extended though) And maybe it
can be automated with some text processing tools?
Best,
Oleg Abrosimov.