Re: Proposal: A block between "try" and "catch".
Geert-Jan Giezeman wrote:
A possible solution could be a try block with an else part, like it
exists in python. That construct is more structured than a goto.
try {
My_object o;
} catch (My_exception &ex) {
...
} else {
// o was constructed
// preceding catch clause does not apply here
o.foo();
}
I can see some problems with this syntax.
1. Syntactically, the scope of the object is still apparently finished at
the end of the try { ... } block, and it's neither natural nor consistent
to have the scope implicitly extended to the else { ... } block.
2. Semantically, using the object is a part of the "normal" process, and
constructing an object and using it subsequently should be considered as
one group of operations. However, this syntax separates the usage with
the construction and makes the code hard to read, understand and maintain.
The problem is worse if there are many catch blocks.
To avoid these problems, a better syntax would be something that puts a
"try ends here" or "no catch from here" mark *inside* the try block.
For example:
try {
My_object obj;
default: // no catching from here
obj.foo();
obj.bar();
}
catch (My_exception& ex) {
// ...
}
I used "default" here because its attribute as a label fits well here.
(It could be, say, "throw default;" to be more explicit.)
Among other (somewhat random) candidates that come to my mind, those
in the form of statements (e.g. "break try;"), including expression
statements ("catch = 0;"), do not match well with the implied semantics,
because it is not something to be executed at that point. In addition,
the "= 0" syntax is not qualifying one declaration as in the pure
virtual function case.
Or another syntax could be a block inside, like this:
try {
My_object obj;
try void { // exceptions not caught
// "try void"? "void try"? "try = 0"? ...
obj.foo();
obj.bar();
}
obj.qux(); // exceptions caught
}
catch (My_exception& ex) {
// ...
}
This has an advantage of being able to control the precise range where
exceptions should not be caught, instead of having it always end at the
end of the try block, at the cost of an extra level of indentation.
--
Seungbeom Kim
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]