异常设计:从文件中读取数据的自定义异常?

时间:2010-03-31 03:20:19

标签: c# exception custom-exceptions

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

所以它读取,例如,

Name
Age
Weight

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

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

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

5 个答案:

答案 0 :(得分:3)

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

  • 将自定义异常类命名为尽可能“意图透露”。因此,NameTooLongException优于InvalidNameException
  • 此异常也应该有助于客户端解决问题..(啊我需要缩短文件中的名称vs挖掘异常/代码以了解名称无效的原因。)缩短发现 - 和客户的解决周期时间。

答案 1 :(得分:1)

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

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

换句话说,如果要中断当前操作并且不想返回部分结果,则只应抛出异常。

答案 2 :(得分: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语句来捕获。

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

  • System.Exception的
    • DataLoadException
      • NameException
        • NameTooLongException
        • InvalidNameException
      • AgeException
      • ...

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

答案 3 :(得分:1)

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

  1. 读取外部数据源(文件)
  2. 从读取数据构造对象。
  3. 将对象传递给应用程序的另一部分(以执行进一步处理)。
  4. 我会将验证限制在以下情况:

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

答案 4 :(得分:0)

它最适合批处理,我会说,创建验证和ErrorData类。数据类将具有Linenumber(CSV linenumber),Message,如果您认为任何属性适合。

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

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

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