我遇到了以下代码片段。名称已更改以保护无辜者:
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 block 之前检查文件是否存在。这让我觉得有点多余。
异常处理的重点是捕获意外情况。我完全希望该文件在那里,因此删除存在性检查并让异常处理捕获它(如果它不是接缝对我来说是一个合理的解决方案)。
你怎么看?
最佳答案
文件不存在是我们可以合理预期的 - 因为我们处于 UI 级别(我假设,因为 MessageBox
),所以对请求进行完整性检查是合理的,并且直接告诉用户并取消即可。
如果我们深入代码的内部(从 UI 中删除了几个级别),那么异常是正确的 - 但我仍然可能首先检查文件是否存在并给出一个合理的错误。当然,任何文件存在性检查都会立即成为线程竞争条件;-p
关于c# - 相同条件下的 Guard Clause 和 Exception 处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/840210/