2011-03-16 31 views
1

我有下面的代码抛出捕食异常

try 
{ 
    fileInfo.CopyTo(destination, true); 
} 
catch (IOException ioex) 
{ 

} 

log4net的日志:

35552|384|1|ERROR| at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 

我需要吃这种例外和记录它。我需要抑制这个错误信息。

如何做到这一点?

+3

不要在你的catch中调用log.Error? – BlackICE 2011-03-16 17:30:35

+1

@David:我的猜测是他正在编写一个记录未处理异常的代码库,并且他无法控制未处理的异常处理程序。 – 2011-03-16 17:32:43

+0

@Harpo可以大大降低发生异常的可能性,但对于IO内容,您仍然需要恰当地捕获并处理异常,因为不能保证在检查时间和执行IO操作的时间之间有一些外部程序没有修改该磁盘,使该操作不再有效。 (并且...它看起来像我回复的评论已被删除...) – Davy8 2011-03-16 17:35:42

回答

1

我怀疑你需要看看Log4net,看看是否有办法只记录未处理的异常(如果这是你想要的)或者告诉它忽略特定位置的异常。

为什么你想隐藏这个呢?如果这是因为发生了很多事情,并用无用的信息填满日志,那么在调用CopyTo以确保它有成功的合理机会(即路径有效,文件存在等)之前,您可能需要进行一些验证。这也将减少排在第一位的例外数量。例外情况在性能方面有点昂贵,所以如果可以的话,你需要防止它们发生。

正如我在这个问题的评论中提到的那样,你不能完全删除异常处理,因为在检查它存在和实际调用CopyTo之间始终有另一个程序删除该文件的机会,但它应该是非常罕见的发生。

如果这种情况没有经常发生和/或您已经在进行检查,那么偶尔会发生什么危害?

0

把函数调用中一个try/catch,抓问题的异常,并提供一个空块:

try 
{ 
    fileInfo.CopyTo(destination, true); 
} 
catch (Exception) 
{ 
    // do nothing 
} 

注意捕捉异常(而不是正确的子类)是可怕的做法。

好的,这个问题是我写的这个悄悄编辑的。我不知道log4net会记录所有通过CLR的异常。我很快就会删除它,但现在我会留下来以备进一步评论。

+0

这是一个比OP最初发布的代码更好的解决方案吗?他应该坚持吞咽一个特定的例外,只要确保它是正确的(并且在所有情况下它都是可以忽略的,这是很难证明的)。 Log4net可能有一些特定的内容记录了所有抛出的异常,在这种情况下,他应该查阅文档或等待熟悉Log4net的回答者。 – 2011-03-16 17:44:40

+0

@ P.Brian.Mackey:哦,不公平。他编辑了这个问题!在那种情况下,我显然对log4net不够熟悉。我不知道你可以拦截异常捕获。这让我觉得这是一种可怕的做法 - 如果一些设计不佳的图书馆使用例外来表示失败情况,那该怎么办?日志会被完全污染,可能会被吃掉的异常! – 2011-03-16 17:50:28

+0

我的想法是,因为这不是一个例外,而是一个错误。正如它所说。是否有可能吃错误? – DarthVader 2011-03-16 17:52:16