繁体   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