2010-04-25 12 views
5

Piszę aplikację aC# i chcę wyprowadzać komunikaty o błędach do konsoli lub skrzynki wiadomości (w zależności od typu aplikacji: enum AppTypeChoice {Console, Windows}), a także kontrolować, czy aplikacja działa, czy nie (bool StopOnError).Dlaczego jest tu niedostępny kod?

Wpadłem na tę metodę, która sprawdzi wszystkie kryteria, ale otrzymuję ostrzeżenie "nieosiągalny wykryty kod". Nie rozumiem, dlaczego!

Oto cały sposób (sami Brace dla pewnego kodu hobbystów!)

 

    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 
    } 
 

Ponadto, choć mam swoją uwagę, aby uzyskać typ aplikacji, ja tylko przy stałej na szczycie plik (np. AppTypeChoice.Console w aplikacji Console itp.) - czy istnieje lepszy sposób robienia tego (mam na myśli dowiedzieć się w kodzie, czy jest to aplikacja DOS lub Windows)?

Zauważyłem również, że mogę używać skrzynki z pełną ścieżką w aplikacji Console ... Jak źle to zrobić (mam na myśli, czy otrzymam smołę i opierzałem się, gdy inni programiści to zobaczą? !)

Dzięki za pomoc

+0

Czy to cała metoda? –

+1

@Raj: Spójrz na ostatnią linię. – SLaks

+0

Dziękuję SLAKS! –

Odpowiedz

1

dokładniej przyjrzeć tym kodem ...

DebugLevelChoice level = DataDefs.DebugLevel; 

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

powyższy kod będzie nieosiągalny, ponieważ można ustawić level być zawsze DebugLevel więc nigdy nie będzie None . Pomoże nam to dalej, jeśli powiesz nam więcej o tym, co mówi błąd, na przykład o tym, na czym polega jego linia lub który kod jest nieosiągalny.

+0

Niepoprawnie. Ponieważ nie jest to "const", nie spowoduje to błędu. (Sprawdziłem) – SLaks

+0

-1. W jaki sposób kompilator wie, czy DataDefs.DebugLevel może być nigdy Brak, czy nie? Ponadto nieosiągalny kod nie znajduje się w ogóle w tym stwierdzeniu. – Joren

+0

@Joren: Nie ma i nie jest to miejsce, gdzie występuje błąd. Ta odpowiedź jest błędna. – SLaks

0

Fakt, że używasz stałej w instrukcji warunkowej, jest dokładnie przyczyną pojawienia się tej wiadomości. Kompilator mówi ci, że jedna ze ścieżek w tej instrukcji nie może zostać wykonana, ponieważ oznaczałoby to często problem logiczny.

Tak więc, jeśli tak można powiedzieć zdefiniować AppType jako stały (AppTypeChoice.Console) to pierwszy punkt w tym bloku nie zostaną wykonane:

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

tak, widzę to teraz - chcę ustawić to dla każdego programu (konsoli lub systemu Windows), a NIE mieć go jako stałą. Duh! NIE WIERZĘ, że to przegapiłem! Dzięki, chłopaki – Richard

+0

Dziękuję wam wszystkim za pomoc - właśnie zebrałem trochę więcej wiedzy C#! – Richard

2

Jeżeli wartość DataDefs.StopOnError jest fałszywy, wówczas Ciało "jeśli" będzie nieosiągalne. Sprawdź, czy jest to wartość domyślna.

+3

Tak, ale tylko wtedy, gdy jest to "const". – SLaks

10

DataDefs.StopOnError jest stałą czasu kompilacji równą false.

Dlatego kompilator zastępuje go false (lub czymkolwiek go ustawiłeś) w pobliżu początku procesu kompilacji.

Dlatego kod kompiluje się:

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

To oczywiście nieosiągalny.

Najprostszym rozwiązaniem jest utworzenie pola DataDefs.StopOnError zamiast const.

Kompilator poda to ostrzeżenie tylko wtedy, gdy wszystkie zawarte w nim wartości są stałymi w czasie kompilacji lub literałami, więc użycie dowolnego innego pola dla DataDefs.StopOnError zatrzyma ostrzeżenie.

+0

Ah ... Kiedy więc staje się wartością, którą chcę? lub w jaki sposób ustawić ją na wartość, którą powinienem mieć? – Richard

+1

Co masz na myśli? – SLaks

0

W przypadku okna komunikatu nie jest dobrym pomysłem użycie okna komunikatu do raportowania danych z wiersza poleceń. Gdy pojawi się okno komunikatu, uniemożliwi to wykonanie programu wiersza poleceń, dopóki użytkownik nie wejdzie z nim w interakcję. Może to prowadzić do problemów, gdy jakiś inny program wywoła twój program i nikt nie będzie w stanie kliknąć OK. Lepiej używać konsoli do generowania błędów; inni programiści będą Ci wdzięczni za uratowanie ich przed koniecznością włamywania się dookoła okna wiadomości.

Powiązane problemy