为什么这里有无法访问的代码?

时间:2010-04-25 21:38:41

标签: c#

我正在编写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应用程序)?

另外,我注意到我可以在控制台应用程序中使用带有完全限定路径的消息框...这样做有多糟糕(我的意思是,当其他开发人员看到它时,我会得到涂焦油和羽毛吗?! )

感谢您的帮助

5 个答案:

答案 0 :(得分:10)

DataDefs.StopOnError是一个等于false的编译时常量。

因此,编译器会在编译过程开始附近用false(或者你设置的任何内容)替换它。

因此,您的代码编译为:

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

这显然是无法到达的。

最简单的解决方案是制作DataDefs.StopOnError字段readonly而不是const

如果涉及的所有值都是编译时常量或文字,编译器将仅发出此警告,因此使用DataDefs.StopOnError的任何其他类型的字段将停止警告。

答案 1 :(得分:2)

如果DataDefs.StopOnError的值为false,则“if”的主体将无法访问。检查这是否是默认值。

答案 2 :(得分:1)

特别注意这段代码......

DebugLevelChoice level = DataDefs.DebugLevel;

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

上面的代码无法访问,因为您将level设置为始终为DebugLevel,因此它永远不会是None。如果你能告诉我们更多关于错误的内容,例如,它的内容是什么或哪些代码无法访问,它会对我们有所帮助。

答案 3 :(得分:0)

您在条件语句中使用常量的事实正是您看到此消息的原因。编译器告诉你该语句中的一个路径永远不会被执行,因为这通常表明存在逻辑问题。

因此,如果您将appType定义为常量(AppTypeChoice.Console),那么此块中的第一个子句将永远不会被执行:

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

答案 4 :(得分:0)

关于消息框,使用消息框从命令行报告数据不是一个好主意。弹出消息框时,它将阻止命令行程序完成执行,直到用户与之交互。当其他程序调用您的程序时,这可能会导致问题,并且没有人可以单击“确定”。最好使用控制台进行错误输出;其他开发人员会感谢您保存他们不必破解消息框。