Pergunta

Exceções em C++ não precisam ser detectadas (sem erros em tempo de compilação) pela função de chamada.Portanto, cabe ao desenvolvedor decidir se deve capturá-los usando try/catch (ao contrário de Java).

Existe uma maneira de garantir que as exceções lançadas sejam sempre capturadas usando try/catch pela função de chamada?

Foi útil?

Solução

Não.

Ver Uma visão pragmática das especificações de exceção por razões pelas quais não.

A única maneira de "ajudar" isso é documentando as exceções que sua função pode lançar, digamos, como um comentário no arquivo de cabeçalho que a declara.Isso não é imposto pelo compilador nem nada.Use revisões de código para esse propósito.

Outras dicas

Você não deveria usar uma exceção aqui.Obviamente, este não é um caso excepcional se você espera isso em todos os lugares em que usa esta função!

Uma solução melhor seria fazer com que a função retornasse uma instância de algo assim.Em compilações de depuração (supondo que os desenvolvedores exercitem os caminhos de código que acabaram de escrever), eles receberão uma declaração se esquecerem de verificar se a operação foi bem-sucedida ou não.

class SearchResult
{
  private:
    ResultType result_;
    bool succeeded_;
    bool succeessChecked_;

  public:
    SearchResult(Result& result, bool succeeded)
      : result_(result)
      , succeeded_(succeeded)
      , successChecked_(false)
    {
    }

    ~SearchResult()
    {
      ASSERT(successChecked_);
    }

    ResultType& Result() { return result_; }
    bool Succeeded() { successChecked_ = true; return succeeded_; }
}

Fora do escopo da sua pergunta, pensei em não postar isso, mas em Java existem na verdade 2 tipos de exceções, marcadas e desmarcadas.A diferença básica é que, assim como em c[++], você não precisa capturar uma exceção não verificada.

Para uma boa referência tente isso

Chris'provavelmente tem a melhor resposta pura para a pergunta:

No entanto, estou curioso sobre a raiz da questão.Se o usuário deveria sempre envolva a chamada em um bloco try/catch, a função chamada pelo usuário deveria realmente estar lançando exceções em primeiro lugar?

Esta é uma pergunta difícil de responder sem mais contexto em relação à base de código em questão.Atirando do quadril, acho que a melhor resposta aqui é encerrar a função de modo que a interface pública recomendada (se não apenas, dependendo do estilo geral de exceção do código) faça o try/catch para o usuário.Se você está apenas tentando garantir que não haja exceções não tratadas em seu código, testes de unidade e revisão de código são provavelmente a melhor solução.

Existe uma maneira de garantir que as exceções jogadas sejam sempre pegas usando o Try/Catch pela função de chamada?

Acho bastante engraçado que a turma de Java - incluindo me a mim - está tentando evitar exceções verificadas.Eles estão tentando evitar serem forçados a capturar exceções usando Exceções de tempo de execução.

Houve uma vez uma tentativa de adicionar especificações de exceção dinâmica à assinatura de uma função, mas como a linguagem não conseguia garantir sua precisão, eles foram posteriormente depreciados.

Em C++ 11 e posteriores, agora temos o especificador noexcept.
Novamente, se a assinatura estiver marcada para ser lançada, ainda não há exigência de que ela seja tratada pelo chamador.


Dependendo do contexto, você pode garantir que o comportamento excepcional seja tratado codificando-o no sistema de tipos.

Ver: std::opcional como parte dos fundamentos da biblioteca.

Ou você pode começar a lançar exceções críticas.Certamente, uma exceção de violação de acesso pegar a atenção de seus usuários.

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