Pergunta

Consideramos que pode ocorrer uma exceção na inicialização.Então escrevemos o bloco try/catch.

int f(){
    throw 1;
}

class A
{
public:
    A() try : _k(f())
    {}
    catch (int)
    {
        std::cout << "Exception 1" << std::endl;
    }

private:
    int _k;
};

Mas a captura relança a exceção em um nível mais profundo.Isso significa que o próximo código

try
{
    A a;
} catch(int)
{
    std::cout << "Exception 2" << std::endl;
}

produzirá:

Exception 1
Exception 2

Por que esse bloco try/catch não se comporta da mesma maneira que o bloco try/catch comum?

Exemplo de código completo: http://ideone.com/XjY2d

Foi útil?

Solução

Parece que sua pergunta é:Por que um try/catch em nível de função reproduz automaticamente o exceptoin?Com uma exceção na construção de um objeto, esse objeto é considerado morto antes de ganhar vida.Todos os seus subobjetos são destruídos.Ou seja, se uma exceção for lançada durante a construção não haverá objeto.Se a exceção não fosse lançada, você colocaria a casca de um objeto em suas mãos.Isto claramente não é desejável.

Outras dicas

O objeto que você está construindo não foi realmente construído, então o simples retorno não é uma opção.Esse tipo de try0-catch sempre é relançado (a menos que você lance sua própria exceção da cláusula catch).

Porque não é um bloco try-catch comum, mas um try/catch em nível de função.Ele é relançado automaticamente, a menos que você faça isso explicitamente usando throw.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top