| |
| #include <stdio.h> |
| |
| static unsigned NumAs = 0; |
| |
| struct A { |
| unsigned ANum; |
| A() : ANum(NumAs++) { printf("Created A #%d\n", ANum); } |
| A(const A &a) : ANum(NumAs++) { printf("Copy Created A #%d\n", ANum); } |
| ~A() { printf("Destroyed A #%d\n", ANum); } |
| }; |
| |
| static bool ShouldThrow = false; |
| |
| int throws() |
| try |
| { |
| if (ShouldThrow) throw 7; return 123; |
| } catch (...) { |
| printf("'throws' threw an exception: rethrowing!\n"); |
| throw; |
| } |
| |
| struct B { |
| A a0, a1, a2; |
| int i; |
| A a3, a4; |
| |
| B(); |
| ~B() { printf("B destructor!\n"); } |
| }; |
| |
| B::B() |
| try |
| : i(throws()) |
| { |
| printf("In B constructor!\n"); |
| } |
| catch (int i) { |
| printf("In B catch block with int %d: auto rethrowing\n", i); |
| } |
| |
| |
| int main() { |
| { |
| B b; // Shouldn't throw. |
| } |
| |
| try { |
| ShouldThrow = true; |
| B b; |
| } catch (...) { |
| printf("Caught exception!\n"); |
| } |
| } |