“两种不同的方式”;捕捉;C#中的两种不同类型的异常。一个比另一个好吗?

“两种不同的方式”;捕捉;C#中的两种不同类型的异常。一个比另一个好吗?,c#,try-catch,C#,Try Catch,我以前从未需要一次捕获多个异常。但我的情况是这样的。我想“尝试”复制一个文件。如果目的地不存在,我不想被它打扰。但我仍然希望捕获任何其他类型的异常。例如,未经授权的DaccessException。下面是我尝试过的两件事,但我在网上看到了这两个例子。是一种比另一种更好的编码方式。还是我在这两方面都完全错了?谢谢 catch (DirectoryNotFoundException) { // Do Nothing }

我以前从未需要一次捕获多个异常。但我的情况是这样的。我想“尝试”复制一个文件。如果目的地不存在,我不想被它打扰。但我仍然希望捕获任何其他类型的异常。例如,未经授权的DaccessException。下面是我尝试过的两件事,但我在网上看到了这两个例子。是一种比另一种更好的编码方式。还是我在这两方面都完全错了?谢谢

        catch (DirectoryNotFoundException)
        {
            // Do Nothing
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }


一条建议:永远不要捕获您不打算处理的异常:

catch (DirectoryNotFoundException)
{
    // Do Nothing
}

就您的问题而言,我更喜欢第一种方法(假设您当然知道如何处理您捕获的每个异常)。

第一种方法是更好的形式,但实际上它们都同样有效


选择第一个,它使代码更干净

我选择第一个,原因有三:

  • 它读起来更好(国际海事组织)
  • 我关心的是第二个语句中的
    ex is DirectorNotFoundException
    语句的开销
  • 第一种也更容易修改——如果必须捕获第三种类型的异常,或者第四种类型的异常,或者……,会发生什么

  • 只需确保以正确的顺序捕获异常即可。

    IMHO,多个捕获将降低代码的可读性。这就是我想建议的

    if (Directory.Exists(dirPath))
            {
                try
                {
                    File.Copy(sourceFile, destFile);
                }
                catch (Exception msg)
                {
                    //Handle Exception.
                }
            }
    

    +1.对于其他人来说,更干净的代码总是更好、更容易维护。您批评这种模式是因为您认为应该将代码编写为不抛出,还是因为您更喜欢有条件的?我同意不抛出可能更好,但您并不总是能够控制方法中可能出现的异常。我也读过这篇文章。你说得对,达林。所以我正按照Karthik的建议做。谢谢Karthik。我早该想到的。吉姆,不客气,干杯。@pst是对的;该代码现在有一个不可避免的竞态条件。如果目录在DirectoryExists返回时存在,但在File.Copy启动之前被另一个进程删除,则仍然可能会出现异常。尝试和预测所有可能的“外生”异常通常是不值得的;有时候,最好是抓住这个例外,处理它,然后继续前进。所有这些都是非常好的评论。我会知道,将来如果有必要,我会选择第一个街区。但我一开始就不应该需要这个。谢谢大家!
    if (Directory.Exists(dirPath))
            {
                try
                {
                    File.Copy(sourceFile, destFile);
                }
                catch (Exception msg)
                {
                    //Handle Exception.
                }
            }