Re: Matching throw to catch at compile time?
* James Kanze:
* Alf P. Steinbach:
* Thomas Richter:
The second problem is that you can also throw polymorphic classes, that
is, classes whose type cannot be derived at compile time and whose
static type is different from their dynamic type. If such a class is
thrown, the program control should go to the catch that matches the
*dynamic* type of the exception, and not the static type. Consider:
class A {...};
class B : public A { .. };
void foo()
{
B *b = new B;
try {
bar(b);
} catch(B *ex1) {
... <--- code must go here
} catch(A *ex2) {
...
}
}
void bar(A *a)
{
throw a; // static type is A*, dynamic type is *B
}
Sorry, that's incorrect: C++ throwing is by value always, and the
statically known type is used, always.
At the throw site.
Throwing is at the throw site, yes, that's usually the case.
But now that you draw my attention to the possible vagueness of my
statement: it applies only to throw with an argument.
Throw without an argument uses the existing exception object (or
terminates the program), which in a sense has a dynamic type.
The dynamic type does come into play at the
catch site, although Thomas' example won't do it.
Assuming you mean the dynamic type for the throw's argument has anything
to do with effects at the catch site, sorry, that's incorrect.
Assuming you mean something else (what?), the statement is very misleading.
Thus, I correct it anyhow. ;-)
(A catch of
type A* would catch a thrown B*, however.)
Yes.
--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]