Leer el artículo de Eric Lippert sobre excepciones fue definitivamente una revelación sobre cómo debería abordar las excepciones, tanto como productor como como consumidor. Sin embargo, todavía estoy luchando por definir una directriz sobre cómo evitar lanzar excepciones molestas.
Específicamente:
- Suponga que tiene un método Save que puede fallar porque a) Alguien más modificó el registro antes que usted , ob) El valor que está intentando crear ya existe . Estas condiciones son de esperar y no excepcionales, por lo que en lugar de lanzar una excepción, decide crear una versión de prueba de su método, TrySave, que devuelve un valor booleano que indica si la operación de salvar se realizó correctamente. Pero si falla, ¿cómo sabrá el consumidor cuál fue el problema? ¿O sería mejor devolver una enumeración que indique el resultado, como Ok / RecordAlreadyModified / ValueAlreadyExists? Con integer. TryParse, este problema no existe, ya que solo hay una razón por la que el método puede fallar.
- ¿Es el ejemplo anterior realmente una situación irritante? ¿O lanzar una excepción en este caso sería la forma preferida? Sé que así se hace en la mayoría de las bibliotecas y marcos, incluido el marco Entity.
- ¿Cómo decide cuándo crear una versión de prueba de su método en lugar de proporcionar alguna forma de probar de antemano si el método funcionará o no? Actualmente estoy siguiendo estas pautas:
- Si existe la posibilidad de una condición de carrera, cree una versión de prueba. Esto evita la necesidad de que el consumidor atrape una excepción exógena. Por ejemplo, en el método Guardar descrito anteriormente.
- Si el método para probar la condición prácticamente haría todo lo que hace el método original, cree una versión de prueba. Por ejemplo, integer. TryParse ().
- En cualquier otro caso, cree un método para probar la condición.