C ++: o mecanismo excepção
Video: Gestão de Periféricos: Interrupções
Conteúdo
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 ++ o objeto atirado para um lugar neutro. Em seguida, ele começa a procurar o final da atual experimentar quadra.
Se um experimentar bloco não é encontrado na função atual, o controle passa para a função de chamada. A pesquisa é feita então 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 desenrolar a pilha.
Uma característica importante do desenrolamento da pilha é que, como cada pilha é desenrolado, objetos que vão fora do escopo são destruídos, 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 encasing 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, é feita uma verificação do próximo 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 é encontrada, o programa é encerrado.
Considere o seguinte exemplo:
// CascadingException - o programa a seguir demonstra // um exemplo de pilha desenrolar # 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; "construindo objeto " lt; lt; rótulo lt; lt; endl-} ~ Obj () {cout lt; lt; "objeto destructing " 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 um ( `a`) - try {Obj b ( `b`) - f2 () - } catch (float f) {cout lt; lt; "captura Float" lt; lt; endl-} catch (int i) {cout lt; lt; "int captura" lt; lt; endl-} catch (...) {cout lt; lt; corda("captura genérico") lt; lt; endl -}} f2 void () {try {Obj-C ( `c`) - F3 () -} catch (string msg) {cout lt; lt; "captura de Cordas" 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 Apress Enter para continuar ...
Primeiro, você vê os quatro objetos a, b, c, e d ser construído como a Principal() chamadas F1 () que chama f2 () que chama f3 (). Ao invés de voltar, no entanto, f3 () lança o inteiro 10. Porque nenhuma experimentar bloco é definido nas f3 (), ++ desenrola C f3 () `s pilha, objecto que provoca d a ser destruído.
Video: 2. Ligações Químicas: A Ligação Covalente [Química Geral]
A função seguinte a montante da cadeia, f2 () define um experimentar bloco, mas sua única pegar frase é projetado para lidar com uma corda, que não coincide com o int lançada. Portanto, C ++ continua procurando. esta desenrola f2 () `s empilhar, resultando em objeto c sendo destruída.
Back in F1 (), C ++ encontra outra experimentar quadra. Saindo que objecto bloco causas b para ir fora do escopo. C ++ ignora o primeiro pegar frase para um flutuador. Nas próximas pegar frase corresponde ao int exatamente, então C ++ passa o controle para esta frase.
O controlo passa do prendedor (int) frase para a chave de fechamento da último 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.