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

本文关键字:返回 状态 异常 组件 处理 错误 | 更新日期: 2023-09-27 18:11:04

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

public interface IFileProcessor
{
    bool ProcessFile(string fileContents)
}

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

  • 查看文件夹中新添加的文件
  • 读取文件内容
  • 获取这些IFileProcessor具体实现的集合
  • 依次调用每个组件上的ProcessFile(),传递文件内容
  • 如果组件不能处理该文件,则返回false,否则将处理该文件的内容并返回true
  • 如果没有IFileProcessor实现可以处理文件,它将被控制器移动到'UnProcessed'文件夹
  • 如果一个组件成功地处理了文件,它将被移动到'Processed'文件夹
  • 如果组件抛出异常,则将其移动到"Failed"文件夹

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

然而,一旦顶层验证成功,组件将处理文件中的每一行。从这一点开始,单个行处理失败(即验证)是可以接受的,其余的流程继续进行。

这就是问题所在,我想知道是否最好记录验证错误发生,然后在过程结束时抛出异常,或者更改ProcessFile()签名以返回enum (Processed, UnProcessed, ProcessedWithErrors之一)?

从我所读到的,似乎异常是优于状态码的路由,但是在这个特殊的情况下,一个进程可以继续,在结束时使用一个人为的异常来声明进程没有100%完成似乎是错误的。

我很想听听大家对这个问题的看法。

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

一个建议:

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

在严重失败的情况下,我将返回一个异常,以便调用者可以执行正确的操作。可以派生一个异常类,这样try捕获就干净了。

的例子:

try
{
    FileProcessorResult fpr = ProcessFile(Contents);
    //Do something with fpr
}
catch (FileProcessorException fpe)
{
   //Something unexpected occured during file processing, handle it
}

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

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

我同意你的观点,在函数结束时抛出异常来表示部分处理似乎很奇怪,我也会使用返回代码并在函数完全失败时抛出异常(即未能从文件中读取等)。

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

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