Creo que todas las respuestas que explican que no debe tener una bandera que controle si se produce una excepción o no son buenas. Su consejo sería mi consejo para cualquiera que sienta la necesidad de hacer esa pregunta.
Sin embargo, quería señalar que hay una excepción significativa a esta regla. Una vez que esté lo suficientemente avanzado como para comenzar a desarrollar API que utilizarán cientos de otras personas, hay casos en los que es posible que desee proporcionar dicha marca. Cuando estás escribiendo una API, no solo estás escribiendo a los puristas. Estás escribiendo a clientes reales que tienen deseos reales. Parte de su trabajo es hacerlos felices con su API. Eso se convierte en un problema social, en lugar de un problema de programación, y a veces los problemas sociales dictan soluciones que serían menos que ideales como soluciones de programación por sí mismas.
Es posible que tenga dos usuarios distintos de su API, uno de los cuales quiere excepciones y otro que no. Un ejemplo de la vida real donde esto podría ocurrir es con una biblioteca que se usa tanto en desarrollo como en un sistema integrado. En entornos de desarrollo, los usuarios probablemente deseen tener excepciones en todas partes. Las excepciones son muy populares para manejar situaciones inesperadas. Sin embargo, están prohibidos en muchas situaciones incrustadas porque son demasiado difíciles de analizar en tiempo real. Cuando realmente le importa no solo el tiempo promedio que lleva ejecutar su función, sino también el tiempo que le lleva a cualquier diversión individual, la idea de desenrollar la pila en cualquier lugar arbitrario es muy indeseable.
Un ejemplo de la vida real para mí: una biblioteca de matemáticas. Si su biblioteca de matemáticas tiene una Vectorclase que admite obtener un vector unitario en la misma dirección, debe poder dividir por la magnitud. Si la magnitud es 0, tiene una situación de división por cero. En desarrollo quieres atraparlos . Realmente no quieres sorprender dividir entre 0 dando vueltas. Lanzar una excepción es una solución muy popular para esto. Casi nunca sucede (es un comportamiento verdaderamente excepcional), pero cuando sucede, quieres saberlo.
En la plataforma integrada, no desea esas excepciones. Tendría más sentido hacer un chequeo if (this->mag() == 0) return Vector(0, 0, 0);. De hecho, veo esto en código real.
Ahora piense desde la perspectiva de un negocio. Puede intentar enseñar dos formas diferentes de usar una API:
// Development version - exceptions // Embeded version - return 0s
Vector right = forward.cross(up); Vector right = forward.cross(up);
Vector localUp = right.cross(forward); Vector localUp = right.cross(forward);
Vector forwardHat = forward.unit(); Vector forwardHat = forward.tryUnit();
Vector rightHat = right.unit(); Vector rightHat = right.tryUnit();
Vector localUpHat = localUp.unit() Vector localUpHat = localUp.tryUnit();
Esto satisface las opiniones de la mayoría de las respuestas aquí, pero desde la perspectiva de la compañía esto no es deseable. Los desarrolladores integrados tendrán que aprender un estilo de codificación, y los desarrolladores de desarrollo tendrán que aprender otro. Esto puede ser bastante molesto y obliga a las personas a una sola forma de pensar. Potencialmente peor: ¿cómo se demuestra que la versión incrustada no incluye ningún código de excepción? La versión de lanzamiento se puede mezclar fácilmente, escondiéndose en algún lugar de su código hasta que una costosa Junta de revisión de fallas lo encuentre.
Si, por otro lado, tiene una bandera que activa o desactiva el manejo de excepciones, ambos grupos pueden aprender exactamente el mismo estilo de codificación. De hecho, en muchos casos, incluso puede usar el código de un grupo en los proyectos del otro grupo. En el caso de este código unit(), si realmente le importa lo que sucede en un caso dividido por 0, debería haber escrito la prueba usted mismo. Por lo tanto, si lo mueve a un sistema integrado, donde solo obtiene malos resultados, ese comportamiento es "sensato". Ahora, desde una perspectiva comercial, entreno a mis codificadores una vez, y usan las mismas API y los mismos estilos en todas las partes de mi negocio.
En la gran mayoría de los casos, desea seguir los consejos de otros: use modismos similares tryGetUnit()o similares para funciones que no arrojen excepciones y, en su lugar, devuelva un valor centinela como nulo. Si cree que los usuarios pueden querer usar tanto el código de manejo de excepciones como el de manejo de excepciones uno al lado del otro dentro de un solo programa, quédese con la tryGetUnit()notación. Sin embargo, hay un caso de esquina donde la realidad de los negocios puede mejorar el uso de una bandera. Si te encuentras en ese caso de esquina, no tengas miedo de tirar las "reglas" por el camino. ¡Para eso están las reglas!