1

我有一个从逗号分隔的文本文件中读取数据并构造实体对象列表的方法,比如说客户。

例如,它读取,

Name
Age
Weight

然后我将这些数据对象传递给业务层,业务层将它们保存到数据库中。现在这个文件中的数据可能是无效的,所以我试图找出最好的错误处理设计。例如,文本文件的 Age 字段中可能包含字符数据。

现在我的问题是,我应该从读取文件数据的方法中抛出异常,例如 InvalidAgeException 吗?假设 Name 字段有长度限制,所以如果长度大于最大字符,我是抛出 NameTooLongException 还是只抛出 InvalidNameException,或者我只是接受它并等到业务层得到它并抛出异常从那里?

(如果你能给我指出一个很好的资源,那也很好)

4

5 回答 5

3

我会说 -快速而响亮地失败。因此,一旦出现不一致就抛出异常(除非您想掌握文件中的所有错误并将其显示给用户......在这种情况下,您需要基于收集参数的设计与基于异常的设计) .

  • 将自定义异常类命名为尽可能“揭示意图”。所以 NameTooLongException 比 InvalidNameException 好
  • 此外,异常应该对客户解决问题有帮助..(啊,我需要缩短文件中的名称与挖掘异常/代码以了解为什么名称无效。)缩短发现和解决您的客户的周期时间。
于 2010-03-31T03:30:16.973 回答
1

如果数据不可用,最好在读取记录时抛出异常。例如,如果您知道年龄字段中的字符数据只有在用户弄乱您的应用程序之外的文件时才有可能。如果您尝试序列化一个对象,弄乱序列化的数据,然后尝试反序列化它,就会发生这种情况。

如果数据打算在您的应用程序之外进行操作,或者如果您可以恢复一些记录或其他记录,那么最好实现某种复合“错误”集合。您不一定需要抛出异常。您可以创建新的 Exception 实例并将它们放入一个集合中。

换句话说,只有当你想中断当前操作并且不想返回部分结果时才应该抛出异常。

于 2010-03-31T03:31:48.943 回答
1

看起来你在你的方法中做了一些事情:

  1. 读取外部数据源(文件)
  2. 从读取的数据构造对象。
  3. 将对象传递给应用程序的另一部分(以执行进一步处理)。

我会将验证限制在以下情况:

  1. 如果您无法在此处读取文件(没有文件,文件格式错误)。
  2. 如果由于数据抛出而无法构造对象(“年龄”由于非数字字符而无法解析)。
  3. 验证业务层中的业务逻辑(名称太长或太小,权重太大或太小)。
于 2010-03-31T04:46:26.373 回答
1

这取决于你的逻辑是如何设置的。如果您的文件读取逻辑是泛型的(不是 C# 泛型,在某种意义上它不是特定的泛型),最好将异常放在抛出更高一点的位置。

例如,如果这是设置方式:

// just an example
FileContents ReadFile(string path)
{
   // Don't necessarily throw exceptions related to data validity
}

SomeObject FromFile(string path)
{
   FileContents contents = ReadFile(path);
   // Do throw exceptions related to data validity

   // construct your object
}

这一切都归结为在哪里进行验证是有意义的。作为一般规则,您应该只在特殊情况下抛出异常(在特定级别无法恢复的情况)。调用堆栈中较高的某些方法可能知道在这种情况下该做什么。

此外,如果您必须抛出许多不同类型的异常,出于对方法调用者(间接或直接,您或其他开发人员)的礼貌,最好让您的异常具有共同的基本异常(其他比System.Exception),所以可以用尽可能少的catch语句来捕获。

一个示例继承层次结构可能是:

  • 系统异常
    • 数据加载异常
      • 名称异常
        • NameTooLongException
        • 无效名称异常
      • 年龄异常
      • ...

这样,如果调用者只想知道方法是否成功,他们只需要捕获DataLoadException,而不是捕获每种类型的可抛出异常。如果调用者想知道到底出了什么问题,他们也可以这样做。

于 2010-03-31T04:00:50.033 回答
0

它最适合批处理,我想说的是,创建一个验证和 ErrorData 类。数据类将有 Linenumber(CSV linenumber)、Message 以及如果您认为任何属性合适。

读取文件并将整个集合传递给验证类,以验证并获取 ErrorData 类集合中的错误。

处理正确的数据并记录或抛出错误。在这里,您既要处理写入数据,又要通知客户端(调用对象)有错误。

有人可以打开日志/或错误消息来更正数据。

于 2010-03-31T04:01:27.033 回答