Em Java, a throws
palavra - chave permite que um método declare que não tratará uma exceção por conta própria, mas sim a lançará para o método de chamada.
Existe uma palavra-chave / atributo semelhante em C #?
Se não houver equivalente, como você pode obter o mesmo (ou similar) efeito?
c#
java
exception-handling
throws
Louis Rhys
fonte
fonte
O op está perguntando sobre o equivalente em C # da
throws
cláusula Java - não athrow
palavra - chave. Isso é usado em assinaturas de método em Java para indicar que uma exceção verificada pode ser lançada.Em C #, não há equivalente direto de uma exceção verificada do Java. C # não tem cláusula de assinatura de método equivalente.
traduz para
fonte
Sim, este é um tópico antigo, mas frequentemente encontro tópicos antigos quando estou pesquisando respostas no Google, então decidi adicionar algo útil que encontrei.
Se você estiver usando o Visual Studio 2012, há uma ferramenta integrada que pode ser usada para permitir um equivalente de "lançamento" de nível de IDE.
Se você usar os Comentários de documentação XML , conforme mencionado acima, poderá usar a tag <exception> para especificar o tipo de exceção lançada pelo método ou classe, bem como informações sobre quando ou por que ela é lançada.
exemplo:
fonte
throws
provavelmente não significa nada para o tempo de execução, além de ser informativo para o desenvolvedor. Da mesma forma, o que @mvanella apontou aqui é a maneira do C # de fazer exatamente o mesmo. Presumo que você já saiba que esta "documentação xml" tem um propósito mais significativo. Eu sei que este tópico é antigo.throws
cláusula ou acionado por umthrow
comando. Isso significa que se ocorrer uma RunTimeException e não for tratada no mesmo método em que ocorre, a execução será interrompida aí.Aqui está uma resposta a uma pergunta semelhante que acabei de encontrar em bytes.com :
fonte
Depois de passar pela maioria das respostas aqui, gostaria de acrescentar algumas idéias.
Confiar nos comentários da documentação XML e esperar que outros confiem é uma escolha ruim. A maior parte do código C # que encontrei não documenta métodos completa e consistentemente com Comentários de documentação XML. E há o maior problema de que, sem as exceções verificadas em C #, como você poderia documentar todas as exceções que seu método lança para que o usuário da API saiba como lidar com todas individualmente? Lembre-se de que você só conhece aqueles em que se lança com a palavra-chave throw em sua implementação. APIs que você está usando dentro de sua implementação de método também podem lançar exceções que você não conhece, porque podem não estar documentadas e você não está lidando com elas em sua implementação, então elas explodirão em face do chamador de seu método. Em outras palavras,
Andreas vinculou uma entrevista com Anders Hejlsberg nas respostas aqui sobre por que a equipe de design do C # decidiu contra as exceções verificadas. A resposta final para a pergunta original está oculta nessa entrevista:
Em outras palavras, ninguém deve estar interessado em que tipo de exceção pode ser esperada para uma API em particular, pois você sempre irá capturar todas elas em todos os lugares. E se você quiser realmente se preocupar com exceções específicas, como tratá-las depende de você e não de alguém definindo uma assinatura de método com algo como a palavra-chave Java throws, forçando o tratamento de uma exceção específica em um usuário API.
-
Pessoalmente, estou dividido aqui. Concordo com Anders que verificar as exceções não resolve o problema sem adicionar problemas novos e diferentes. Assim como com os comentários da documentação XML, raramente vejo código C # com tudo incluído nos blocos try finally. Parece-me que esta é realmente sua única opção e algo que parece uma boa prática.
fonte
Na verdade, não ter verificado exceções em C # pode ser considerado uma coisa boa ou ruim.
Eu mesmo considero uma boa solução, uma vez que as exceções verificadas fornecem os seguintes problemas:
Por causa disso, na maioria dos aplicativos maiores, você verá o seguinte padrão frequentemente quando ocorrerem exceções marcadas:
O que significa essencialmente emular a maneira como C # / .net lida com todas as exceções.
fonte
Você está perguntando sobre isso:
Relançando uma exceção
ou
fonte
throw
. Ao usá-lo, o rastreamento da pilha não será perdido.Existem algumas semelhanças fugazes entre o .Net CodeContract
EnsuresOnThrow<>
e othrows
descritor java , em que ambos podem sinalizar para o chamador como o tipo de exceção que pode ser levantada a partir de uma função ou método, embora também haja diferenças importantes entre os 2:EnsuresOnThrow<>
vai além de apenas declarar quais exceções podem ser lançadas, mas também estipula as condições sob as quais elas têm garantia de serem lançadas - isso pode ser um código bastante oneroso no método chamado se a condição de exceção não for fácil de identificar. Javathrows
fornece uma indicação de quais exceções podem ser lançadas (isto é, IMO, o foco em .Net está dentro do método que contrai para provar othrow
, enquanto em Java o foco muda para o chamador para reconhecer a possibilidade da exceção).throws
para a mesma exceção em sua interface.Manual de Contratos de Código aqui
fonte
Se o propósito do método c # for apenas lançar uma exceção (como o tipo de retorno js diz), eu recomendaria apenas retornar essa exceção. Veja o exemplo abaixo:
fonte
Para quem está se perguntando, você não precisa nem definir o que captura para passar para o próximo método. No caso de você querer todo o tratamento de erros em um thread principal, você pode apenas pegar tudo e repassar assim:
fonte