c# - 相同条件下的 Guard Clause 和 Exception 处理

标签 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 block 之前检查文件是否存在。这让我觉得有点多余。

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

你怎么看?

最佳答案

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

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

关于c# - 相同条件下的 Guard Clause 和 Exception 处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/840210/

相关文章:

r - 如何忽略错误并继续处理列表项?

list - 对象引用未设置为对象的实例- “Object includes a list property”

c# - 如何使用 LibTiff.Net 拆分多页 Tiff

c# - 可以在 BEARER 授权 header 中嵌入用户名吗?

c# - 未找到自定义 Visual C++ CRL 程序集

json - 为什么我的 req.flash 不起作用?

vba - 时间识别子上的Excel类型不匹配错误

c# - 从 Base 继承的基类属性

c# - 主线程上的网络请求导致帧率延迟峰值

java - 如何阻止 Eclipse 在每次捕获异常时中断?