2012-07-20 26 views
12
class A{ 
    public: 
     A() { throw string("exception A"); }; 
}; 

class B{ 
    A a; 
    public: 
     B() try : a() {} catch(string& s) { cout << &s << " " << s << endl; }; 
}; 

int main(){  
    try{ 
     B b; 
    }catch(string& s){ 
     cout << &s << " " << s << endl; 
    } 
    return 0; 
} 

La salida es:excepción se detecta dos veces

0x32c88 exception A 
0x32c88 exception A 

Desde la excepción ya estaba atrapado en el constructor de B, por lo que todavía se producen en la función principal?

Respuesta

21

Cuando el flujo de contol llega al final del controlador para una función-try-block de un constructor, la excepción detectada se volverá a lanzar automáticamente.

No puede suprimir una excepción lanzada durante la construcción de una clase base o miembro en un constructor de clase derivado ya que esto daría lugar a un objeto derivado construido con una base o miembro que no se pudo construir.

Este GOTW es relevante: http://www.gotw.ca/gotw/066.htm

De ISO/IEC 14882: 2011 15.3 [except.handle]/15:

La excepción actualmente manejado se relanza si el control llega al final de un controlador del function-try-block de un constructor o destructor. [...]