2

我遇到了以下代码片段。名称已更改以保护无辜者:

    public void RunProgram()
    {
        System.IO.FileInfo fInfo = new System.IO.FileInfo(Application.StartupPath + "Program.exe");

        if (!fInfo.Exists)
        {
            System.Windows.Forms.MessageBox.Show("Program could not be found, please verify your installation.\n\nDetails:\n" + fInfo.FullName);
            return;
        }

        try
        {
            System.Diagnostics.Process  process = new System.Diagnostics.Process();
            System.Diagnostics.ProcessStartInfo pStart  = new System.Diagnostics.ProcessStartInfo(); 
            pStart.FileName = fInfo.FullName;
            pStart.UseShellExecute = true;
            process.StartInfo = pStart;
            process.Start();
        }
        catch
        {
            System.Windows.Forms.MessageBox.Show(string.Format("An error occurred trying to run the program:{0}", fInfo.FullName));
        }
    }

我知道这里有一些问题:

  • 异常类型没有单独处理
  • 错误消息信息不足

请放心,我也会解决这些问题,但我的主要问题是在 try/catch 块之前检查文件是否存在。这让我觉得有点多余。

异常处理的重点是捕捉意外情况。我完全希望文件在那里,因此删除存在检查并让异常处理捕获它,如果它对我来说不是一个合理的解决方案。

你怎么看?

4

4 回答 4

2

文件不存在是我们可以合理预期的——因为我们处于 UI 级别(我假设,因为MessageBox),所以合理地检查请求是合理的,直接告诉用户并取消。

如果我们深入代码的内部(从 UI 中删除了几个级别),那么例外将是正确的 - 但我仍然可能首先检查文件是否存在并给出一个合理的错误。当然,任何文件存在性检查都会立即成为线程竞争条件;-p

于 2009-05-08T15:00:46.917 回答
1

我投票取消.Exists()支票。

至于处理异常类型,我的正常模式是从通用异常处理程序开始以捕获所有内容,但还要确保记录这些异常。然后将其分开以根据日志处理不同的异常。

于 2009-05-08T15:01:46.493 回答
0

它是多余的,可能会给人一种虚假的安全感。请注意,由于并发性,您仍然可能会收到 FileNotFound 异常。

另请参阅:是否存在参数验证可能被视为多余的情况?

于 2009-05-08T15:55:42.463 回答
0

我总是尽量避免例外。这通常是因为我倾向于在启用异常中断的情况下运行 Visual Studio,因此请尽量避免异常。

我还花费了大量时间研究抛出异常代价高昂的嵌入式系统。这可能不是 C# 的情况。

于 2009-05-08T22:49:43.887 回答