2011-10-11 39 views
2

我目前正在设计一个处理不同类型文件的系统。我已经定义了以下接口可以处理错误的组件的异常或返回状态

public interface IFileProcessor 
{ 
    bool ProcessFile(string fileContents) 
} 

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

  • 看一个文件夹中新添加的文件
  • 一个呼叫ProcessFile(读取文件内容
  • 获得这些IFileProcessor具体实现
  • 一个集合)传递文件内容
  • 如果某个组件无法处理该文件,则返回false,否则将处理该内容并返回true
  • 如果没有IFileProcesso r实现可以将它由控制器移动到“未处理”文件夹的文件
  • 如果某个组件成功处理该文件,则该文件将被移动到“已处理”文件夹中
  • 如果某个组件抛出异常,移动到“失败”文件夹

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

但是,一旦顶级验证成功,组件将处理文件中的每一行。从这一点开始,一条生产线可能无法处理(即验证),并且其余的过程继续进行。

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

从我看过的文章看来,异常是状态代码的首选路线,但是在这种特殊的情况下,一个进程可以继续下去,在最后使用一个人为的异常来声明进程没有完成似乎是错误的100 %。

我会真正感兴趣的人民对此的想法。

+0

不要过度设计这个。当文件出现问题时,你需要一个人来采取行动。没有什么有意义的事情可以做,它可以是好的或不可用的。只要确保这个人有一个清晰的诊断看看。 –

+0

嗨汉斯,在这种情况下的要求是,组件必须处理它的一切。文件中的每一行都会经过验证过程,检查该行中的引用是否为我们的系统所知。如果已知该参考线,则处理线,否则将记录验证错误以供稍后进一步检查。 – watsite

回答

2

一个建议:

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

在发生严重故障时,我会返回一个异常,以便调用者可以执行正确的操作。你可以派生一个异常类,以便try catch是干净的。

例子:

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

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

有可能是没有绝对正确的答案,我可以给,所以请把这个作为一个建议。

0

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

我虽然同意你的看法,它似乎不可思议扔在函数结束时出现一个异常来表示部分处理,我也会用返回代码并在函数完全失败时抛出一个异常(即无法从文件读取等)。

这样做的一个好的原因是异常可能不会在调用函数中处理,并且如果文件被部分处理,您可能不希望执行停止,对吗?

无论你选择哪条路,你都需要彻底地记录返回代码/抛出的异常,其他人会为此感谢你。