Pergunta

Em Java se um argumento de entrada para um método é inválido, podemos lançar uma IllegalArgumentException (que é do tipo RuntimeException). Em C ++, não há noção de exceções verificadas e não verificadas. Existe uma excepção semelhante em C ++ padrão que pode ser usado para indicar uma exceção de tempo de execução? Ou existe um estilo comum não no padrão, mas todos seguem na prática, para uma situação como esta?

Ou, devo apenas criar minha própria exceção personalizada e jogá-lo?

Foi útil?

Solução

Ao contrário de Java, C ++ não tem uma "estrutura padrão", mas apenas uma pequena (e opcional) biblioteca padrão. Além disso, existem diferentes opiniões sob programadores C ++ se deve usar exceções em tudo .

Portanto, você vai encontrar diferentes recomendações por pessoas diferentes: alguns gostam de tipos uso de exceção da biblioteca padrão, algumas bibliotecas (por exemplo Poco) usar uma hierarquia de exceção personalizada (derivado de std :: exception), e outros não uso exceções em todos (por exemplo Qt).

Se você quiser ficar com a biblioteca padrão, existe um tipo de exceção especializada:. invalid_argument (estende logic_error)

#include <stdexcept>

// ...
throw std::invalid_argument("...");

Para a referência: Aqui está uma visão geral dos tipos de exceção padrão definidos (e documentados) em stdexcept:

exception
    logic_error
        domain_error
        invalid_argument
        length_error
        out_of_range
    runtime_error
        range_error
        overflow_error
        underflow_error

Outras dicas

std :: domain_error pode ser o que você está procurando, mas eu suspeito que muito poucas pessoas usá-lo. A maioria das pessoas derivam seus próprios tipos de exceção de std :: exceção.

Eu sempre uso std::invalid_argument para argumentos ilegais.

Se por inválido você quer dizer faz nem método esperado satisfeitos valores que você pode jogar

std::logic_error 
or 
std::runtime_error.

Se você quer dizer alguma coisa relacionada com moldes como um objeto não pode ser convertido para outro - não há exceção para isso e não vai ser jogado automaticamente.

Na verdade ele vai. Mas só por dynamic_cast <> em referências. Ele vai jogar

std::bad_cast

Eu não estou certo de que é uma boa idéia para jogar este por conta própria.

Eu prefiro usar logic_error e seus derivados no caso de alguém se passaram parâmetro errado porque é um erro de lógica: programador passou tipo errado de argumento.

Mas, mais de tudo o que eu gosto de usar assert em tais casos. Porque tais coisas como passar valores errados ou tipos para a sua função pode ser aceitável apenas durante o desenvolvimento e esses controlos devem ser evitados na liberação.

Você pode lançar uma exceção padrão ou rolar seus próprios. Você pode querer incluir informações adicionais na exceção você está jogando, e que seria uma boa razão para fazer o seu próprio.

Pessoalmente, eu não vi verificação de tal domínio em sistemas que eu tenha trabalhado. Ela certamente não é universal.

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