
From: Beman Dawes <bdawes@acm.org>
At 07:17 PM 3/31/2005, Peter Dimov wrote:
If you make 'exists' throw an exception, you will create a demand for a 'preexists' query that will be used to detect whether the actual 'exists' will throw.
I agree, but don't think that has to lead to a "no" answer. One plan would be to supply a status query function, perhaps named status(), which would never throw and which would return a bitmask which could be queried as to the exact attributes that apply. Including an attribute that indicates one of these oddball errors has occurred. As with POSIX, there would presumably be an lstat()-like query function that did not resolve symbolic links.
I think a single, overloaded function can quite easily accomodate everything and still be easy to use: struct no_throw_t { }; static no_throw_t nothrow; struct resolve_symlinks_t { }; static resolve_symlinks_t resolve_symlinks; enum attributes { ... }; attributes stat(path); // !resolves, throws attributes stat(path, no_throw_t); // !resolves, !throws attributes stat(path, resolve_symlinks_t); // resolves, throws attributes stat(path, resolve_symlinks_t, no_throw_t); // resolves, !throws
Presumably then exists() and the is_x() functions would be specified in terms of status() and lstatus() results. So in effect exists() and the is_x() functions are conveniences, very useful in many but not all cases, and safe to use casually since obscure errors will cause exceptions.
Sounds great to me! -- Rob Stewart stewart@sig.com Software Engineer http://www.sig.com Susquehanna International Group, LLP using std::disclaimer;