【问题标题】:What exception to throw when parsing a byte array? (C#)解析字节数组时抛出什么异常? (C#)
【发布时间】:2011-11-02 16:36:17
【问题描述】:

我正在解析一个字节数组,它实际上是在消息总线上发送的固定长度记录。如果数据无效(乱码或不符合记录规范),那么我想抛出异常。像这样的:

public DomainObject ParseTheMessage(byte[] payload){
    Validate(payload);//throws an exception if invalid

    ...do creation of domain object
}

有谁知道在这些情况下我是否可以抛出一个好的标准异常,还是我应该创建自己的特定异常?

【问题讨论】:

    标签: c# exception bytearray


    【解决方案1】:

    System.ArgumentOutOfRangeException:

    ArgumentOutOfRangeException 在调用方法时抛出 传递给该方法的参数中至少有一个不为空,并且确实 不包含有效值。

    throw new ArgumentOutOfRangeException("payload","description of the specific problem");
    

    【讨论】:

      【解决方案2】:

      你可以使用ArgumentException:

      throw new ArgumentException("payload", "'payload' should be...");
      

      正如下面 x0r 所提到的,MSDN recommends 仅派生自 ArgumentException,这样做可能会或可能不会给您带来任何附加值,这取决于通过参数传递的“无效”参数的定义 - 如果您可以定义严格规定可能出错的地方,那么您可能会受益于创建更精确命名的异常,这些异常源自 ArgumentException

      或者,您可以使用 InvalidDataException 来提供相同类型的信息性消息,如果您有的话:

      数据流格式无效时引发的异常。

      虽然指的是数据流,但可能会有一些反对意见 - 让我们看看。

      如果只是一般的“错误格式”例外,那么您确实有 FormatException - 但对于您的情况(见上文)来说,这可能是 faaar 太笼统了,尽管可能很远更好的例外,它确实取决于:

      当参数的格式不符合被调用方法的参数规范时抛出的异常。

      【讨论】:

      • 对于 ArgumentException,文档说你应该只从它派生 msdn.microsoft.com/en-us/library/z4c5tckx.aspx
      • 然后他可以从中派生并将其命名为ArgumentInvalidFormatException,但这个名称并没有比有用的message 更有可信度,除非 OP 有一些更具体的案例来定义一个“无效”参数。
      • 听起来它可能更合适。我会考虑的。谢谢。 (InvalidDataException 是......)。顺便说一句,我喜欢堆栈溢出。在询问后的几秒钟内得到很好的回应。
      【解决方案3】:

      如果数据有效性标准是特定于应用程序的并且不匹配任何一般情况(如索引超出范围等),我认为最好使用您自己的异常。对于标准情况,使用现有异常,例如,NullPointerException if payload == null。

      【讨论】:

        【解决方案4】:

        您可以抛出带有自定义 InnerException 的 ArgumentException。

        【讨论】:

        • 是的,我对此有点动摇,但由于各种原因,它不太适合(我提供的代码只是正在发生的事情的一个非常基本的版本)。我有点希望 InvalidFormatException 或其他东西,但我怀疑它要么是 ArgumentException 要么是自定义的。
        猜你喜欢
        • 1970-01-01
        • 2020-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-23
        • 2020-04-17
        • 2011-04-11
        • 1970-01-01
        相关资源
        最近更新 更多