Pergunta

eu estou lendo esta página http://www.cplusplus.com/doc/tutorial /exceptions.html ele diz que se eu escrever function () throw (); há exceções podem ser geradas nessa função. Tentei em msvc 2005 escrita throw (), throw (int), throw () e nada. cada um tinha os mesmos resultados. Nada. Eu joguei int, char *, um outro tipo e foi tudo apanhado da mesma maneira. Parece que lance não afeta-lo em tudo. O que faz function () throw () realmente fazer?

Foi útil?

Solução

este artigo para obter detalhes sobre especificações de exceção C ++ e implementação da Microsoft:

Microsoft Visual C ++ especificações de exceção 7.1 ignora a menos que eles estão vazios. especificações de exceção vazias são equivalentes a __declspec(nothrow), e eles podem ajudar o compilador para reduzir o tamanho do código.

[...] Se ele vê uma especificação de exceção vazio, ele irá supor que você sabe o que está fazendo e otimizar afastado a mecânica para lidar com exceções. Se a sua função joga de qualquer maneira - bem, que vergonha. Use esse recurso apenas se você estiver 100% positiva a sua função não jogar e nunca será.

Outras dicas

O que você está encontrando é que essa versão do VC ++ não impor exceções de especificação. Eu acredito que foi documentado como uma variação do padrão.

No entanto, especificações de exceção geralmente não são uma boa idéia. Se um programa viola-los em uma implementação de normas conformes (que o VC ++ a partir VS 2005 não era, neste caso), o sistema é suposto para pegá-lo. Isto significa que a especificação não é uma otimização dica compilador, mas sim força o compilador para ir para comprimentos extras, e às vezes produzir um código abaixo do ideal.

Consulte lógica Boost para razões pelas quais o impulso altamente considerado O projeto não utilizar especificações de exceção. Esta é Boost, que é algo da criança do poster para fazer coisas estranhas e úteis com peças avançados da língua.

Um olhar pragmático na exceção Especificações :

(Mis) entendimentos

A segunda questão tem a ver com saber o que você está recebendo. como muitos pessoas notáveis, incluindo os autores da especificação excepção impulso lógica, têm colocá-lo, programadores tendem a usar exceção Especificações como se comportaram a forma como o programador gostaria, em vez da maneira que eles realmente fazem se comportam.

Aqui está o que muitas pessoas pensam que especificações de exceção fazer:

  • Garantia que funciona somente irá lançar exceções listadas (possivelmente none).

  • Ativar otimizações do compilador com base no conhecimento que só listada exceções (possivelmente nenhum) será lançada.

As expectativas acima são, de novo, enganosamente perto de ser correto.

Veja o link para os detalhes completos.

lançar uma exceção não é suficiente, você precisa de um bloco try {} catch() para capturar exceções. Se você não capturar exceções, std::terminate() é chamado e seu programa sai abruptamente. Tire algum tempo e ter ir em este .

especificações do throw são projetados para duas finalidades:

  1. Para servir como um contrato entre a interface implementada e interface de usuário - você Estado que exceções podem ser throwned do seu método, algumas pessoas consideram que é parte de uma interface. (Contrato) Ala exceções verificadas em Java.

  2. Como uma maneira de sinalizar ao compilador que ele pode aplicar certas otimizações no caso há exceções podem ser geradas a partir de um método / procedimento (criação de manipulação de exceção custos algo)

lançar uma exceção não especificada no throw () cláusula é um erro, no entanto em nenhum momento é a implementação necessário para verificá-lo para você. Na verdade, não é ainda possível verificar, já que inclui todas as possíveis exceções de sub-rotinas suas chamadas de sub-rotinas. (Possivelmente de outros módulos) Não é mesmo possível em um único módulo, como é facilmente reduzido a um problema da parada:)

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