我遇到了以下代码片段。名称已被更改以保护无辜者:
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块之前检查文件是否存在。这让我觉得有点多余。
异常处理的目的是捕捉意外情况。我完全希望文件存在,所以删除存在检查,如果它没有找到合理的解决方案,只是让异常处理抓住它。
您怎么看?
答案 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#的情况。