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