针对相同条件的保护条款和异常处理

时间:2009-05-08 14:57:06

标签: c# exception error-handling guard-clause

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

    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 个答案:

答案 0 :(得分:2)

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

如果我们深入到代码的内容(从UI中移除了几个级别),那么异常将是正确的 - 但我仍然可能首先检查文件是否存在并给出明显的错误。当然,任何文件存在检查都是线程竞争条件;-p

答案 1 :(得分:1)

我投票给remove the .Exists() check.

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

答案 2 :(得分:0)

这是多余的,可能会给人一种虚假的安全感。请注意,由于并发,您仍然可以获得FileNotFound异常。

另见:Is there a case where parameter validation may be considered redundant?

答案 3 :(得分:0)

我总是尽量避免异常。这通常是因为我倾向于在启用异常的情况下运行visual studio,因此尽可能避免异常。

我还花了大量时间在嵌入式系统上工作,抛出异常代价很高。这可能不是C#的情况。