在代码中使用异常... C#文件IO异常

时间:2011-02-22 17:01:24

标签: c# exception-handling

在处理异常时,我有一个问题需要重新编写正确的编程习惯。 我们有生产代码,如:

try 
{

File.Copy(src,dest);

}
catch(Exception ex)
{
  ShowMessageToUser(ex.Message); 
}

这是一个好习惯吗?我认为我们应该总是使用专门的异常并捕获它们....另一方面,我确实知道File.Copy可以抛出几个不同的异常,为每个异常编写一个catch块会很痛苦。 ..?那么在这种情况下应该做些什么....是否有一组我们可以用来捕获的文件特定的例外集合?

谢谢,欢迎任何评论。

5 个答案:

答案 0 :(得分:2)

作为一般惯例,我认为这不是一个好习惯。就个人而言,我会用不同的例外处理这个问题,并且只处理你可以正确处理的异常。

在这个特定场景中,我也会避免这种情况。我更愿意处理显式异常类型,除非是为了自定义消息给用户。

这主要是因为异常消息实际上不是针对最终用户的 - 它们是要由开发人员解释的消息。我觉得直接向用户显示异常消息,特别是对于可能发生异常的操作,这是一种不好的做法。

您应该处理每个异常,并在此操作的上下文中为用户提供有意义的消息。

File.Copy只能抛出8种类型的异常 - 使用消息处理每一种异常只有32行代码 - 当你考虑到有一个清晰,有意义的消息的额外好处时,这真的不是那么多所有案例都提交给最终用户。

答案 1 :(得分:1)

由于这个原因,IO通常很痛苦 - 有很多事情可能会出错。你最好:

  • 在调用File.Copy之前,通过检查所有参数,尽一切可能避免异常。请记住,由于生成堆栈跟踪,.Net异常会导致严重的性能成本。
  • 抓住您知道自己有能力处理的例外情况。对于某些例外,您可能希望显示错误消息并要求用户输入新内容。
  • 如果你不能在那里处理异常,不要抓住它!吞咽异常是所有邪恶的根源。报告错误消息仅比吞咽异常略好,并且只会使最终用户感到困惑。

看起来似乎很多工作,但有时需要做很多工作才能制作出稳定的节目。

答案 2 :(得分:0)

您可以使用专门的异常来根据您获得的错误类型执行不同的操作。如果您只想向用户显示默认错误消息...那么您的代码就足够了。

但是,举个例子说,如果由于安全问题而发生异常,你会想要记录异常...你会写下这样的话:

catch (PermissionDeniedException ex)
{
    Log(ex.foo);
    ShowMessageToUser(ex.Message); 
}
catch(Exception ex)
{
    ShowMessageToUser(ex.Message); 
}

记住要始终从更具体到更一般的例外。

答案 3 :(得分:0)

是的,这是一个不好的做法,你应该使用特定的例外情况,然后通用Exception降低catch块。

如果你觉得它们太多了,你应该至少为大多数预期的文件特定异常创建catch块,然后有通常的异常捕获块

答案 4 :(得分:0)

您的示例很容易实现,但几乎没有最佳做法。作为一般规则

  • 此时只捕获您实际感兴趣的异常。让其他所有东西泡在其他地方。
  • 您还可以使用超类来捕获特定的异常组。
  • 对非错误的内容使用例外。例如,如果用户提供副本的文件名,则可以预先检查 (如果文件存在),而不是依赖于异常。例外情况属于“特殊情况”,不适用于可预见的情况。
  • 如果您正在攻击快速脚本,请随意使用例子中的例外; - )