2010-04-25 12 views
5

Estoy escribiendo aC# app y quiero enviar mensajes de error a la consola o a un buzón (Dependiendo del tipo de aplicación: enum AppTypeChoice {Console, Windows}), y también controlo si la aplicación sigue ejecutándose o no (bool StopOnError)¿Por qué hay un código inalcanzable aquí?

Se me ocurrió este método que verificará todos los criterios, pero recibo una advertencia de "código inalcanzable detectado". No puedo ver por qué!

Aquí es todo el método (Prepárense para un cierto código aficionado!)

 

    public void OutputError(string message) 
    { 
     string standardMessage = "Something went WRONG!. [ But I'm not telling you what! ]"; 
     string defaultMsgBoxTitle = "Aaaaarrrggggggggggg!!!!!"; 
     string dosBoxOutput = "\n\n*** " + defaultMsgBoxTitle + " *** \n\n Message was: '" + message + "'\n\n"; 
     AppTypeChoice appType = DataDefs.AppType; 
     DebugLevelChoice level = DataDefs.DebugLevel; 

     // Decide how much info we should give out here... 
     if (level != DebugLevelChoice.None) 
     { 
      // Give some info.... 
      if (appType == AppTypeChoice.Windows) 
       MessageBox.Show(message, defaultMsgBoxTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); 
      else 
       Console.WriteLine(dosBoxOutput); 
     } 
     else 
     { 
      // Be very secretive... 
      if (appType == AppTypeChoice.Windows) 
       MessageBox.Show(standardMessage, defaultMsgBoxTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); 
      else 
       Console.WriteLine(standardMessage); 
     } 

     // Decide if app falls over or not.. 
     if (DataDefs.StopOnError == true) 
      Environment.Exit(0); // UNREACHABLE CODE HERE 
    } 
 

Asimismo, si bien tengo su atención, para obtener el tipo de aplicación, sólo estoy usando una constante en la parte superior de el archivo (es decir, AppTypeChoice.Console en una aplicación de consola, etc.): ¿hay una forma mejor de hacerlo (me refiero a averiguar en el código si se trata de una aplicación de DOS o Windows)?

Además, me di cuenta de que puedo usar un cuadro de mensaje con una ruta completa en una aplicación de consola ... ¿Qué tan malo es hacer eso? (¿Me pintarán y emplumarán cuando otros desarrolladores lo vean? !)

Gracias por su ayuda

+0

¿Es ese el método completo? –

+1

@Raj: mira la última línea. – SLaks

+0

Gracias SLaks! –

Respuesta

1

analizar específicamente el código ...

DebugLevelChoice level = DataDefs.DebugLevel; 

     // Decide how much info we should give out here... 
     if (level != DebugLevelChoice.None) 

El código anterior será inalcanzable porque se establece level estar siempre DebugLevel por lo que nunca será None . Nos ayudaría aún más si pudieras decirnos más sobre lo que dice el error, por ejemplo, qué líneas tiene o qué código es inalcanzable.

+0

incorrecto Como no es 'const', eso no dará un error. (Lo comprobé) – SLaks

+0

-1. ¿Cómo sabría el compilador si DataDefs.DebugLevel puede ser None o no? Además, el código inalcanzable no está dentro de esa declaración if en absoluto. – Joren

+0

@Joren: No es así, y no es allí donde está el error. Esta respuesta es incorrecta – SLaks

0

El hecho de que esté utilizando una constante en una instrucción condicional es exactamente la razón por la que está viendo este mensaje. El compilador le dice que una de las rutas en esa declaración nunca se puede ejecutar, ya que esto a menudo indica un problema de lógica.

lo tanto, si como usted dice se define como una constante de Tipo de Aplicación (AppTypeChoice.Console) entonces la primera cláusula en este bloque no se ejecutará:

// Give some info.... 
if (appType == AppTypeChoice.Windows) 
    MessageBox.Show(message, defaultMsgBoxTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); 
else 
    Console.WriteLine(dosBoxOutput); 
+0

Sí, lo veo ahora - Quiero configurar eso para cada programa (Consola o Windows), y NO lo tengo como una constante. ¡Duh! ¡NO CREO que me haya perdido eso! Gracias, muchachos – Richard

+0

Gracias a todos por su ayuda. ¡Acabo de obtener un poco más de conocimiento de C#! – Richard

2

Si el valor de DataDefs.StopOnError es falsa, entonces la el cuerpo del "si" será inalcanzable. Verifica si es el predeterminado.

+3

Sí, pero solo si es 'const'. – SLaks

10

DataDefs.StopOnError es una constante de tiempo de compilación igual a false.

Por lo tanto, el compilador lo reemplaza con false (o lo que sea que lo haya configurado) cerca del inicio del proceso de compilación.

Por lo tanto, el código se compila a:

if (false == true) 
    Environment.Exit(0); // UNREACHABLE CODE HERE 

Obviamente, esto es inalcanzable.

La solución más simple es hacer el campo DataDefs.StopOnErrorreadonly en lugar de const.

El compilador solo mostrará esta advertencia si todos los valores implicados son constantes de tiempo de compilación o literales, por lo que si se utiliza cualquier otro tipo de campo para DataDefs.StopOnError se detendrá la advertencia.

+0

Ah ... ¿Cuándo se convierte en el valor que quiero que sea? o ¿cómo puedo hacer que sea el valor que tengo? – Richard

+1

¿Qué quieres decir? – SLaks

0

Con respecto al cuadro de mensaje, no es una buena idea usar un cuadro de mensaje para informar datos desde la línea de comando. Cuando aparece un cuadro de mensaje, evitará que el programa de línea de comando finalice la ejecución hasta que el usuario interactúe con él. Esto puede provocar problemas cuando otro programa invoca su programa y nadie está cerca para hacer clic en Aceptar. Es mejor usar la consola para la salida de error; otros desarrolladores le agradecerán por salvarlos de tener que hackear el cuadro de mensaje.

Cuestiones relacionadas