Equivalente de IllegalArgumentException de Java em C ++
-
22-08-2019 - |
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?
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.