2011-04-11 64 views
1

的区别是什么(如果有的话),以书面形式:抛出新的异常与没有周围的捕获之间的差异,并把它放在一个捕获?

if (File.Exists(filePath)) 
    //Something 
else 
    throw new FileNotFoundException(); 

和包围的if/else块以上,与抓一试梅开二度。

其实,是否需要捕获?如果是这样,它会发生什么?或者更好的比较是将上面的块的if部分放在try语句中(不包含if语句)并捕获FileNotFoundException,抛出调用堆栈(抛出)。

感谢

回答

0

通过围绕带有try catch的if块意味着你将不得不处理丢失的文件,然后在catch中(请参阅@ lukas的回答)。如果你打算在这段代码中处理丢失的文件,那么你不需要else-throw,因为你已经知道文件从第一个if中丢失了。另一方面,如果你想调用代码(在调用堆栈的更高处)来处理丢失的文件,那么在异常时传递该信息是可以的,但是你不想然后去包装它一个try-catch,因为它不会被抛出这个代码块。

+0

因此,在一个带有GUI的应用程序中,我总是想抛出异常。我认为如果有一堆代码在基于GUI的系统上运行,而不是由用户调用,那么应该使用我展示的模式(try/catch,no throw;)。 – dotnetdev 2011-04-12 22:45:39

0

一个比其它更安全。

当你检查一个文件是否存在时,没有什么能保证这个文件在那个方法的执行下面。

如果你用Try/Catch块包围它,你可以优雅地捕捉毛刺,相应地采取行动,并在Finally块中包装任何你想要的东西。例如,关闭文件流。

1

我没有看到任何理由抛出异常将抛出无论如何。尽管抛出一个具有更高抽象级别的异常可能会更有用。

+0

'File.Exists()'虽然不会引发异常,但只在文件不存在时返回false。 – 2011-04-11 23:35:45

+1

我认为他的意思是,如果你试图访问文件,就好像它存在。 – R0MANARMY 2011-04-11 23:37:12

+0

@Xavier - 但如果你尝试访问文件而不询问File.Exists(),你会如果文件不存在(谢谢你R0MANARMY) – 2011-04-11 23:37:31

0

异常处理是应用程序关心的问题。如果您对(a)例外或(b)特定例外感兴趣,那么您使用try/catch。由于异常处理比if检查慢很多个数量级,并且您知道该文件可能不存在,因此您可以采取性能降低或编写您的代码。这只是您选择在文件不存在的情况下获得性能的原因。

有些人说如果你能做些什么,你应该只能捕捉一个异常,而且主要是他们是正确的,但是有一个地方我总是使用异常处理。

  • 当从一个服务返回 边界。有时候,这是安全 相关(隐藏实现细节 ),虽然主要是为了提高 运行时诊断
  • 当发出跨越服务 边界的呼叫。这通常与可靠性 有关,尽管最重要的是帮助 排除故障。

当使用异常处理进行诊断时,我基本上只记录异常并提高备份。

0

是的,需要捕获,因为竞争条件。其他进程/线程可以删除/更改/移动/等。文件。你无法阻止它。

try 
{ 
    using (//your file opens here) 
    { 

    } 
} 
catch (FileNotFoundException) 
{ 
    // handle FileNotFoundException 
}