Utilizando excepciones para el control de flujo

ace poco me dijeron que estoy abusando de las excepciones para controlar el flujo en mis aplicaciones, así que este es mi intento de aclarar la situación de alguna maner

En mi opinión, un método debería arrojar una excepción, cuando se encuentra con una situación, que no se puede manejar internamente o podría manejarse mejor por el lado de la llamada.

Entonces - existe un conjunto particular de reglas, que puede usarse para responder el siguiente conjunto de preguntas al desarrollar sus aplicaciones:

¿Cuándo debo lanzar una excepción y cuándo debo escribir código confuerte garantía de nothrow, lo cual podriasimply return bool para indicar éxito o fracaso?

Debería tratar de minimizar el número de situaciones, cuando el método arroja una excepción o, por el contrario, debería maximizarse para proporcionar flexibilidad al manejar estas situaciones?

Deberíastick a la convención de lanzamiento de excepciones establecido por los frameworks / tiempos de ejecución que uso cuando desarrollo mis aplicaciones o debería envuelva todas estas llamadas para que coincidan con mi propia estrategia de lanzamiento de excepciones?

También me aconsejaron usar códigos de error para el manejo de errores, que parece bastante eficiente, pero feo desde el punto de vista sintáctico (también, cuando los usa, un desarrollador pierde la capacidad de especificar la salida de un método). ¿Qué piensas sobre esto

Ejempl Para eltercer pregunta (estaba usando un marco de E / S y encontré la siguiente situación):

El marco descritono utiliza excepciones para manejar errores, pero el otro código los usa. ¿Debo envolver cada posible falla indicada con'???' y lanzar una excepción en este caso? ¿O debería cambiar la firma de mi método abool PrepareTheResultingOutputPath y solo indican si la operación fue exitosa o no?

public void PrepareTheResultingOutputFile(
    String templateFilePath, String outputFilePath)
{
    if (!File.Exists(templateFilePath))
        // ???

    if (!Directory.MakePath(outputFilePath))
        // ???

    if (File.Exists(outputFilePath))
        if (!File.Remove(outputFilePath))
            // ???

    if (!File.Copy(templateFilePath, outputFilePath)
        // ???
}

Otroejempl - incluso el.NET Framework no sigue una estrategia estricta de lanzamiento de excepciones. Algunos métodos están documentados para generar más de 10 tipos de excepciones diferentes, incluidos los tipos de excepción triviales comoNullArgumentException, pero algunos de ellos simplemente devuelvenbool para indicar el éxito o el fracaso de las operaciones.

¡Gracias

Respuestas a la pregunta(10)

Su respuesta a la pregunta