C ++: O mecanismo de exceção

A próxima vez que você está examinando um C ++ exemplo de código, dê uma olhada mais de perto os passos que o código passa por lidar com uma exceção. Quando o lance ocorre, as primeiras cópias C ++ objeto atirado para um lugar neutro. Em seguida, começa a procurar a extremidade do actual experimentar quadra.

Se um experimentar bloco não é encontrada na função de corrente, o controlo passa para a função de chamada. Uma pesquisa é então efectuada dessa função. Se não experimentar bloco é encontrado lá, o controle passa para a função que a chamou, e assim sucessivamente até a pilha de chamadas de funções. Este processo é chamado desenrolamento da pilha.

Uma característica importante do desenrolamento da pilha é que, como cada pilha é desenrolado, objetos que vão fora do escopo são destruídas, assim como que a função tinha executado um Retorna declaração. Isso mantém o programa de perda de ativos ou deixar objetos pendurados.

Quando o confinante experimentar bloco é encontrado, o código procura o primeiro pegar frase imediatamente após a chave de fechamento do pegar quadra. Se o objeto lançado corresponde ao tipo de argumento especificado na pegar declaração, o controle passa para que pegar frase.

Se não for, é feita uma verificação do lado pegar frase. Se nenhuma correspondência pegar frases são encontrados, as buscas de código para o próximo nível mais alto experimentar bloquear em uma espiral sempre para fora até que uma adequada pegar pode ser encontrado. Se não pegar frase for encontrado, o programa é terminada.

Considere o seguinte exemplo:

// CascadingException - o programa a seguir demonstra // um exemplo de pilha desenrolamento # incluem #incluir #incluir using namespace std - // protótipos de algumas funções que precisaremos f1 latervoid () - f2 void () - F3 void () - classe Obj {public: Obj (char c): label (c) {cout lt; lt; "A construção de objeto" lt; lt; rótulo lt; lt; endl-} ~ Obj () {cout lt; lt; "Destruindo objeto" lt; lt; rótulo lt; lt; endl-} protected: etiqueta de char -} - int main (int nNumberofArgs, char * pszArgs []) {f1 () - // espera até que o usuário está pronto antes de terminar o programa // para permitir que o usuário veja o resultscout programa lt; lt; "Pressione Enter para continuar ..." lt; lt; endl-cin.ignore (10, ' n') - cin.get () - retornar 0-} f1 void () {Obj a ( 'a') - try {Obj b ( 'b') - f2 () -} catch (float f) {cout lt; lt; "Float catch" lt; lt; endl-} catch (int i) {cout lt; lt; "Int catch" lt; lt; endl-} catch (...) {cout lt; lt; string ( "captura genérico") lt; lt; endl -}} f2 void () {try {Obj-C ( 'c') - F3 () -} catch (string msg) {cout lt; lt; "Cadeia catch" lt; lt; endl -}} F3 void () {Obj d ( 'd') - lance 10-}

A saída de executar este programa consta da seguinte forma:

Construindo objeto aConstructing objeto bConstructing objeto cConstructing objeto dDestructing objeto dDestructing objeto cDestructing objeto bInt catchDestructing objeto aPrima Enter para continuar ...

Primeiro, você vê os quatro objetos a, b, c, e d ser construído como a Principal() chamadas F1 () que apela f2 () que apela F3 (). Ao invés de voltar, no entanto, F3 () lança o inteiro 10. Uma vez que nenhum experimentar bloco é definido nas F3 (), ++ desenrola C F3 () # 8242-s pilha, objeto causando d para ser destruída.

A próxima função até a cadeia, f2 () define um experimentar bloco, mas sua única pegar frase é projetado para lidar com a corda, que doesn # 8242-t jogo da int lançada. Portanto, C ++ continua procurando. esta desenrola f2 () # 8242-s empilhar, resultando em objeto c sendo destruída.

Back in F1 (), C ++ encontra outro experimentar quadra. Saindo desse objeto bloco causas b para ir fora do escopo. C ++ ignora o primeiro pegar para uma frase flutuador. Nas próximas pegar frase corresponde ao int exatamente, então C ++ passa o controle para esta frase.

O controlo passa do catch (int) frase para a chave de fechamento da final pegar frase e de lá volta para a Principal(). O final pegar(...) frase, que iria pegar qualquer objeto jogado, é ignorada porque uma correspondência pegar frase já foi encontrado.

menu