C#Application.Current.Shutdown()vs Process.GetCurrentProcess()。Kill()

时间:2014-09-08 14:25:06

标签: c# xml exception exit

据我所知,我永远不会试图杀死或关闭应用程序。 (至少我不能想到我会[安全漏洞可能?]的情况。作为开发人员,我们应该总是尝试抛出异常并在更高级别的某个地方处理它。


我正在处理几个xml加载类。那里有很多验证。如果xml不包含正确的值,大约有100种情况我必须退出应用程序。

我的问题是当我调用Application.Current.Shutdown(0)时;每当检测到无效节点时,我的应用程序立即关闭。事实上,它将运行一些“最终”代码,由于这些无效的值会抛出异常。而且我真的不想捕获已经检查过并发现无效的值的异常。

这里有几个关于为什么不杀死这个过程的问题......我知道。但是有一些最佳实践可以关闭应用程序,然后运行会产生运行时异常的其他代码,或者我真的必须抓住所有这些异常,因为应用程序可能会继续通过该代码吗?

另外,似乎是Application.Current.Shutdown(0);将允许App完成当前范围。我完全感到困惑,因为我认为它应该强制所有例程返回......

感谢您的任何建议! 诺尔

修改 假设我无法打开对进一步执行至关重要的文件。我得到了一个ioexception ...现在我需要关闭应用程序。这有什么好的设计原则?我无法解决我需要关闭应用程序而不运行依赖于该文件中的数据的其他代码的问题。

编辑2

//Retrieve printers in router.devs
_xmlContents.RouterDevsPrinter = getRouterDevsPrinter();

//Check cimgraph queue folder
node = loadNode(XmlDoc, getXPath(XPathVars.QueueFolder));
if (node == null) return false;
_xmlContents.CimgraphPlotQueue = StaticValues.addPathTrailingSlash(node.InnerText);
if (!Directory.Exists(_xmlContents.CimgraphPlotQueue))
{
    StaticValues.showFatalError("Folder not found:", "Could not find the following folder:" + "\"" + _xmlContents.CimgraphPlotQueue + "\"");
    return false;
}

//Check UserXml folder
node = loadNode(XmlDoc, getXPath(XPathVars.UsersXmlFolder));
if (node == null) return false;
_xmlContents.CustomXmlFolder = StaticValues.addPathTrailingSlash(node.InnerText);
if (!Directory.Exists(_xmlContents.CustomXmlFolder))
{
    StaticValues.showFatalError("Folder not found:", "Could not find the following folder:" + "\"" + _xmlContents.CustomXmlFolder + "\"");
    return false;
}

3 个答案:

答案 0 :(得分:2)

关于你的编辑:

  

我们说我无法打开一个对于进一步必不可少的文件   执行。我得到了一个ioexception ...现在我需要关闭应用程序。是什么   这个好的设计原则?我无法解决我需要解决的问题   关闭应用程序而不运行依赖于数据的其他代码   在那个文件中。

通常在这种情况下,我们只是尝试一些代码,处理我们优雅地预见的问题,并根据前一个操作的结果简单地停止执行程序......

尝试/捕获/最终是完美的...请参阅此示例:

        private static bool TryOpenFile()
        {
            try
            {
                // Attempt to open file.
                return true;
            }
            catch (IOException exception)
            {
                // Log the error.
                // Unable to open file... do something for the user.
                return false;
            }
            catch (Exception)
            {
                // Log.
                throw;
            }
            finally
            {
                // Can do things here that should always happen regardless.
            }
        }

然后在调用方法中我可能会写这样的东西......

if (TryOpenFile())
{
     // File can be opened... continue on my merry way.
}
else
{
     // Could not open file.
     return;
}

答案 1 :(得分:1)

在开始任何工作之前,您是否有效?如果是这样,甚至不要显示表格。只需显示一条消息,您的SubMain就会自然退出。

开始一些工作后你会验证吗?如果是这样,请执行Form.Close。您可以选择设置某种表单范围的配置以忽略任何验证。你可能使用Form.Closing事件,所以把它放在那里。

您没有提供任何原因导致应用程序突然崩溃用户。因此,Application.Current.Shutdown()Process.GetCurrentProcess().Kill()都不合适。

正如同行所提到的,让用户知道他们需要做什么是有帮助的。更不用说“错误”(我已经看到一些应用程序这样做了),更有帮助的是知道“由于存在配置错误,应用程序已崩溃。请将以下堆栈跟踪发送到某些电子邮件或致电此人这个扩展(或通过此跟踪系统等提交票证)“。

答案 2 :(得分:0)

您应该重构您的应用,不要求ShutdownKill来电。那是用大锤。

当无效状态发生时,让程序的正常流程结束。