É melhor usar uma cláusula de guarda ou pegar a exceção?

é melhor prevenir exceção com uma cláusula de guarda ou pegar a exceção? Existe uma boa prática? Pro e contras das duas metodologias?

Por exemplo, é melhor isso:

try { param=myArray[3]; } catch (IndexOutOfRangeException e) { do something... } 

ou isto:

 if(myArray.Length < 4) { do something... } else { param=myArray[3]; } 

Obrigado a todos pelas respostas 🙂

é melhor prevenir exceção com uma cláusula de guarda ou pegar a exceção?

No caso de exceções “boneheaded” como índice fora de alcance, sempre o primeiro.

No caso de exceções “exógenas”, sempre as segundas.

Pro e contras das duas metodologias?

Há apenas cons destes últimos no caso de exceções de cabeça fechada. Eles são:

  • Exceções são incrivelmente caras em comparação aos testes.
  • As exceções destinam-se a modelar situações de stream de controle excepcionalmente raras ; se potencialmente acessar um índice fora do intervalo for normal, então não escreva um manipulador de exceções .
  • Exceções são relatadas como exceções de “primeira chance” aos ouvintes, mesmo se a exceção for tratada . Muitos sistemas – ASP, por exemplo – escutam exceções de primeira chance, registram todos eles e tratam componentes que produzem muitos deles como bugs , porque eles são . (Certa vez, apresentei uma exceção deliberada de primeira chance em um caminho de código comum no ASP e, um dia depois, ouvi o que aconteceu. Os testes de subsistema de bugs ficaram malucos.)
  • Há algumas exceções que eu chamo de exceções “boneheaded” – desreferenciamento nulo, índice fora de alcance, e assim por diante – isso porque elas são tão fáceis de evitar e indicam falhas tão obviamente perigosas que devem sempre ser tratadas como erros fatais e nunca manipulados (a menos que o “manipulador” esteja registrando-os antes de encerrar o processo). Não manipule o bug, elimine o bug .

Finalmente, você deve ler meu artigo sobre este assunto.

http://ericlippert.com/2008/09/10/vexing-exceptions/

Use uma cláusula de proteção – capturar a exceção incorre em um alto custo de tempo de execução e, em geral, para melhorar a legibilidade, você deve usar apenas exceções para condições de erro, não para stream de controle normal

Cláusula de guarda. Você nunca quer usar try / catch para stream de controle. Capturar exceções é caro e deve ser evitado tanto quanto você puder.

Nos casos em que a exceção pode ser evitada, evite-a. Sempre.

Captura e manuseio Exceções são caras e nunca devem ser usadas para stream de controle normal. Um guarda é barato e fácil.