我目前正在设计一个处理不同类型文件的系统。我已经定义了以下界面
public interface IFileProcessor
{
bool ProcessFile(string fileContents)
}
旨在创建一些具体实现来处理不同的文件类型。控制器类将负责:
我正在创建一个IFileProcessor的实现,它将首先检查它是否可以根据类型(即csv)处理文件,然后执行一些顶级验证(即检查文件头)。如果这些检查中的任何一个失败,则会向控制器抛出异常,因为整个文件被视为无效。
但是,一旦顶级验证成功,组件将处理文件中的每一行。从这一点开始,单个线路处理(即验证)失败并且其余过程继续进行是可以接受的。
这就是问题所在,我想知道是否最好记录验证错误已经发生,然后在流程结束时抛出异常,或者更改ProcessFile()签名以返回枚举(其中一个已处理,未处理,已处理的错误)?
从我所看到的情况来看,似乎异常是状态代码的首选路径,但是在这个特定情况下,进程可以继续,最后使用人为异常来判断进程没有完成100%似乎是错误的
我真的对人们对此的看法感兴趣。
答案 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)
我不相信这是一个绝对的问题,因为我没有看到明确做到/做那个答案......
我同意你的看法,在函数结束时抛出异常以表示部分处理似乎很奇怪,我也会使用返回代码并在函数完全失败时抛出异常(即读取失败)来自档案等。)。
这样做的一个很好的理由是,在调用函数中可能无法处理异常,如果文件被部分处理,您可能不希望执行停止,对吧?
无论您选择哪条道路,都需要彻底记录投掷的退货代码/异常,其他人会感谢您。