可以使用错误处理的组件的异常或返回状态

时间:2011-10-11 20:33:37

标签: c# design-patterns exception exception-handling

我目前正在设计一个处理不同类型文件的系统。我已经定义了以下界面

public interface IFileProcessor
{
    bool ProcessFile(string fileContents)
}

旨在创建一些具体实现来处理不同的文件类型。控制器类将负责:

  • 观看新添加文件的文件夹
  • 阅读文件内容
  • 获取这些IFileProcessor具体实现的集合
  • 逐个调用每个组件上的ProcessFile(),传递文件内容
  • 如果某个组件无法处理该文件,则返回false,否则将处理该内容并返回true
  • 如果没有IFileProcessor实现可以处理文件,则控制器将其移动到'UnProcessed'文件夹
  • 如果某个组件成功处理该文件,则会将其移至“已处理”文件夹
  • 如果组件抛出异常,则会将其移至“失败”文件夹

我正在创建一个IFileProcessor的实现,它将首先检查它是否可以根据类型(即csv)处理文件,然后执行一些顶级验证(即检查文件头)。如果这些检查中的任何一个失败,则会向控制器抛出异常,因为整个文件被视为无效。

但是,一旦顶级验证成功,组件将处理文件中的每一行。从这一点开始,单个线路处理(即验证)失败并且其余过程继续进行是可以接受的。

这就是问题所在,我想知道是否最好记录验证错误已经发生,然后在流程结束时抛出异常,或者更改ProcessFile()签名以返回枚举(其中一个已处理,未处理,已处理的错误)?

从我所看到的情况来看,似乎异常是状态代码的首选路径,但是在这个特定情况下,进程可以继续,最后使用人为异常来判断进程没有完成100%似乎是错误的

我真的对人们对此的看法感兴趣。

2 个答案:

答案 0 :(得分:2)

一个建议:

不是返回bool或枚举,而是返回一个调用者可以检查的对象。也许称之为FileProcessorResult。在对象中,您可以存储各种信息,如整体成功或失败,验证状态,处理状态等。

如果发生严重故障,我会返回异常,因此呼叫者可以采取正确的行动。您可以派生一个异常类,以便try catch是干净的。

示例:

try
{
    FileProcessorResult fpr = ProcessFile(Contents);
    //Do something with fpr

}
catch (FileProcessorException fpe)
{
   //Something unexpected occured during file processing, handle it
}

我可能没有绝对正确的答案,所以请以此为建议。

答案 1 :(得分:0)

我不相信这是一个绝对的问题,因为我没有看到明确做到/做那个答案......

我同意你的看法,在函数结束时抛出异常以表示部分处理似乎很奇怪,我也会使用返回代码并在函数完全失败时抛出异常(即读取失败)来自档案等。)。

这样做的一个很好的理由是,在调用函数中可能无法处理异常,如果文件被部分处理,您可能不希望执行停止,对吧?

无论您选择哪条道路,都需要彻底记录投掷的退货代码/异常,其他人会感谢您。