Pregunta

Me encontré con el siguiente fragmento de código. Se han cambiado los nombres para proteger a los inocentes:

    public void RunProgram()
    {
        System.IO.FileInfo fInfo = new System.IO.FileInfo(Application.StartupPath + "Program.exe");

        if (!fInfo.Exists)
        {
            System.Windows.Forms.MessageBox.Show("Program could not be found, please verify your installation.\n\nDetails:\n" + fInfo.FullName);
            return;
        }

        try
        {
            System.Diagnostics.Process  process = new System.Diagnostics.Process();
            System.Diagnostics.ProcessStartInfo pStart  = new System.Diagnostics.ProcessStartInfo(); 
            pStart.FileName = fInfo.FullName;
            pStart.UseShellExecute = true;
            process.StartInfo = pStart;
            process.Start();
        }
        catch
        {
            System.Windows.Forms.MessageBox.Show(string.Format("An error occurred trying to run the program:{0}", fInfo.FullName));
        }
    }

Sé que hay algunas cosas mal aquí:

  • Los tipos de excepción no se manejan individualmente
  • El mensaje de error no es lo suficientemente informativo

Tenga la seguridad de que también los abordaré, pero mi pregunta principal es sobre la verificación de la existencia del archivo justo antes del bloque try / catch. Esto me parece un poco redundante.

El punto de manejo de excepciones es detectar condiciones inesperadas. Espero completamente que el archivo esté allí, por lo que eliminar la verificación de existencia y dejar que el manejo de excepciones lo atrape si no parece una solución razonable para mí.

¿Qué opinas?

¿Fue útil?

Solución

Es redundante y puede dar una falsa sensación de seguridad. Tenga en cuenta que aún podría obtener una excepción FileNotFound debido a la concurrencia.

Ver también: ¿Hay algún caso en el que la validación de parámetros pueda considerarse redundante?

Otros consejos

El archivo que no está allí es algo que podemos anticipar razonablemente, y dado que estamos en el nivel de la interfaz de usuario (supongo, dado que MessageBox ), tiene sentido razonable verificar la solicitud, y solo dígale al usuario directamente y cancele.

Si estuviéramos en las profundidades del código (algunos niveles eliminados de la interfaz de usuario), entonces una excepción sería lo correcto, pero aún así probablemente verificaría primero la existencia del archivo y daría un error razonable. Por supuesto, cualquier verificación de existencia de archivo es inmediatamente una condición de carrera de hilo ;-p

Voto para eliminar el . Existe () verificar.

En cuanto al manejo de los tipos de excepción, mi modo normal es comenzar con un controlador de excepciones genérico para capturar todo, pero también asegurarme de que esas excepciones estén registradas. Luego, divídalo para manejar diferentes excepciones basadas en los registros.

Siempre trato de evitar excepciones. Esto se debe generalmente a que tiendo a ejecutar Visual Studio con las excepciones de interrupción habilitadas, así que trate de evitar las excepciones tanto como sea posible.

También pasé una cantidad significativa de tiempo trabajando en sistemas embebidos donde lanzar una excepción era costoso. Este puede no ser el caso de C #.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top