Garantir que as exceções são sempre сaught

votos
21

Exceções em C ++ não precisa ser pego (sem erros de tempo de compilação) pela função de chamada. Portanto, cabe ao julgamento do desenvolvedor se para pegá-los usando try / catch (ao contrário de Java).

Existe uma maneira pode-se garantir que as exceções lançadas são sempre pego usando try / catch pela função de chamada?

Publicado 04/08/2008 em 11:01
fonte usuário
Em outras línguas...                            


7 respostas

votos
22

Não.

Veja Um olhar pragmático na exceção Especificações por razões por que não.

A única maneira você pode "ajudar" esta é documentar as exceções a sua função pode jogar, digamos, como um comentário no arquivo de cabeçalho declarando-o. Isto não é forçado pelo compilador ou qualquer coisa. Use as revisões de código para esse fim.

Respondeu 04/08/2008 em 11:10
fonte usuário

votos
9

Você não deveria estar usando uma exceção aqui. Isto, obviamente, não é um caso excepcional, se você precisa estar esperando por ele em todos os lugares você usar esta função!

Uma solução melhor seria fazer com que a função para retornar uma instância de algo como isto. Em compilações de depuração (desenvolvedores assumindo exercer caminhos de código que acabou de escrever), que vai ter uma declaração se esqueça de verificar se a operação 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_; }
}
Respondeu 24/09/2008 em 10:24
fonte usuário

votos
4

Fora do âmbito da sua pergunta, então eu não debateu este destacamento, mas em Java na verdade existem 2 tipos de exceções, verificados e desmarcada. A diferença básica é que, assim como em c[++], você não tem que pegar uma exceção não verificada.

Para uma boa referência tentar este

Respondeu 04/08/2008 em 18:51
fonte usuário

votos
2

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

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

Esta é uma pergunta difícil de responder sem mais contexto sobre a base de código em questão. Tiro a partir do quadril, eu acho que a melhor resposta aqui é para embrulhar a função de tal forma que a interface pública recomendado (se não só, dependendo do estilo geral exceção do código) faz o try / catch para o usuário. Se você está apenas tentando garantir que não há exceções não tratadas em seu código, testes unitários e revisão de código são provavelmente a melhor solução.

Respondeu 05/08/2008 em 05:56
fonte usuário

votos
0

Era uma vez uma tentativa de adicionar especificações de exceção dinâmicos à assinatura de uma função, mas desde que a língua não poderia impor sua precisão, que mais tarde foram depreciados.

Em C ++ 11 e para a frente, agora temos o especificador noexcept .
Novamente, se a assinatura está marcada para lançar, ainda não há requriement que ser manuseado pelo chamador.


Dependendo do contexto, pode-se assegurar que o comportamento excepcional ser tratado por codificação-lo no sistema tipo.

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

Respondeu 08/05/2016 em 15:07
fonte usuário

votos
0

Existe uma maneira pode-se garantir que as exceções lançadas são sempre pego usando try / catch pela função de chamada?

Acho que é bastante engraçado, que a multidão Java - inclusive eu - está tentando evitar exceções verificadas. Eles estão tentando trabalhar o seu caminho em torno de ser forçado a capturar exceções usando RuntimeExceptions .

Respondeu 04/08/2008 em 19:14
fonte usuário

votos
0

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

Respondeu 04/08/2008 em 18:33
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more