簡體   English   中英

為什么這里有無法訪問的代碼?

[英]Why is there unreachable code here?

我正在編寫ac#app並希望將錯誤消息輸出到控制台或消息框(取決於應用程序類型:enum AppTypeChoice {Console,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應用程序)?

此外,我注意到我可以在控制台應用程序中使用帶有完全限定路徑的消息框...這樣做有多糟糕(我的意思是,當其他開發人員看到它時,我會得到塗焦油和羽毛嗎?!)

謝謝你的幫助

DataDefs.StopOnError是一個等於false的編譯時常量。

因此,編譯器會在編譯過程開始時將其替換為false (或者無論您將其設置為什么)。

因此,您的代碼編譯為:

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

這顯然是無法到達的。

最簡單的辦法是使DataDefs.StopOnErrorreadonly ,而不是const

如果涉及的所有值都是編譯時常量或文字,編譯器將僅發出此警告,因此對DataDefs.StopOnError使用任何其他類型的字段將停止警告。

如果DataDefs.StopOnError值為false,則“if”的主體將無法訪問。 檢查這是否是默認值。

仔細看看這段代碼......

DebugLevelChoice level = DataDefs.DebugLevel;

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

上面的代碼將無法訪問,因為您將level設置為始終為DebugLevel因此它永遠不會為None 如果你能告訴我們更多關於錯誤的內容,例如,它的內容是什么或哪些代碼無法訪問,它會對我們有所幫助。

您在條件語句中使用常量的事實正是您看到此消息的原因。 編譯器告訴你該語句中的一個路徑永遠不會被執行,因為這通常表明存在邏輯問題。

因此,如果您將appType定義為常量(AppTypeChoice.Console),那么此塊中的第一個子句將永遠不會執行:

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

關於消息框,使用消息框從命令行報告數據不是一個好主意。 彈出消息框時,它將阻止命令行程序完成執行,直到用戶與之交互。 當其他程序調用您的程序時,這可能會導致問題,並且沒有人可以單擊“確定”。 最好使用控制台進行錯誤輸出; 其他開發人員將感謝您保存他們不必破解消息框。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM