2010-04-25 3 views
5

Я пишу приложение aC# и хочу выводить сообщения об ошибках на консоль или в ящик сообщений (в зависимости от типа приложения: enum AppTypeChoice {Консоль, Windows}), а также контролировать, работает ли приложение или нет (bool StopOnError).Почему здесь недоступен код?

Я придумал этот метод, который будет проверять все критерии, но я получаю предупреждение «недостижимый код обнаружен». Я не понимаю, почему!

Вот весь метод (Держитесь в течение некоторой любительской коды!)

 

    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 
    } 
 

Кроме того, в то время как у меня есть ваше внимание, чтобы получить тип приложения, я просто используя константу в верхней части файл (т. е. AppTypeChoice.Console в приложении консоли и т. д.) - есть ли лучший способ сделать это (я имею в виду выяснить код, если это приложение DOS или Windows)?

Кроме того, я заметил, что я могу использовать почтовый ящик с полностью определенным путем в приложении консоли. Насколько плохо это делать (я имею в виду, смогу ли я смотать и перенести, когда другие разработчики это видят? !)

Спасибо за вашу помощь

+0

Это весь метод? –

+1

@Raj: Посмотрите на последнюю строку. – SLaks

+0

Спасибо, СЛАКС! –

ответ

1

Посмотрите конкретно в этом коде ...

DebugLevelChoice level = DataDefs.DebugLevel; 

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

код выше будет недоступен, поскольку вы устанавливаете level всегда быть DebugLevel так никогда не будет None , Это помогло бы нам, если бы вы могли рассказать нам больше о том, что говорит об ошибке, например, какие строки на ней или какой код недоступен.

+0

Неправильно. Поскольку это не 'const', это не даст ошибки. (Я проверил) – SLaks

+0

-1. Как компилятор узнает, может ли DataDefs.DebugLevel быть None или нет? Кроме того, недостижимый код не находится внутри этого оператора if вообще. – Joren

+0

@ Joren: Это не так, и это не ошибка. Этот ответ неверен. – SLaks

0

Тот факт, что вы используете константу в условном выражении, является именно тем, почему вы видите это сообщение. Компилятор говорит вам, что один из путей в этом утверждении никогда не может быть выполнен, так как это часто указывает на логическую проблему.

Таким образом, если, как вы говорите, вы определяете APPTYPE как константа (AppTypeChoice.Console), то первый пункт в этом блоке никогда не будет выполнена:

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

Да, я вижу это сейчас - я хочу установить это для каждой программы (Консоль или Windows) и НЕ иметь ее как константу. Duh! Я НЕ ВЕРЮ, что я пропустил это! Спасибо, ребята – Richard

+0

Спасибо вам всем за вашу помощь - я только что почерпнул немного больше знаний C#! – Richard

2

Если значение DataDefs.StopOnError ложно, то тело «если» будет недостижимым. Убедитесь, что это значение по умолчанию.

+3

Да, но только если это 'const'. – SLaks

10

DataDefs.StopOnError - постоянная времени компиляции, равная false.

Поэтому компилятор заменяет его на false (или независимо от того, что вы его установили) в начале процесса компиляции.

Таким образом, ваш код компилируется:

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

Это, очевидно, недостижима.

Самое упрощенное решение: DataDefs.StopOnErrorreadonly вместо const.

Компилятор предоставит это предупреждение только в том случае, если все значения являются константами или литералами времени компиляции, поэтому использование любого другого типа поля для DataDefs.StopOnError остановит предупреждение.

+0

А ... Итак, когда это становится той ценностью, которую я хочу? или как мне это сделать? – Richard

+1

Что это значит? – SLaks

0

Что касается окна сообщений, не рекомендуется использовать окно сообщения для передачи данных из командной строки. Когда появится окно сообщения, это предотвратит выполнение программы командной строки до тех пор, пока пользователь не взаимодействует с ней. Это может привести к проблемам, когда какая-либо другая программа вызывает вашу программу, и никто не хочет щелкнуть OK. Лучше использовать консоль для вывода ошибок; другие разработчики будут благодарны вам за то, что они не смогли взломать окно сообщения.

Смежные вопросы