2011-08-24 35 views
4

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

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

    ...do creation of domain object 
} 

有谁知道,如果有一个很好的标准例外,我可以在这种情况下抛出,或者我应该刚刚创建自己的特定的异常?

回答

3

你可以用ArgumentException

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

正如X0R下面提到,MSDN recommends仅从ArgumentException派生,这样做可能会或可能不会给你任何的增值,这取决于如何定义一个“无效”通过参数传递的参数 - 如果您可以定义严格的可能出错的规则,那么您可以从创建更精确地命名为例外的ArgumentException中受益。

或者,你可以使用InvalidDataException用同一种信息性消息,如果你有一个:

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

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

如果它只是一个一般的“坏格式”异常,那么你必须FormatException - 但可能是faaar太笼统了你的情况(见上文),但也许一个更好的例外,从派生,它确实取决于:

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

+0

为ArgumentException文档说,你应该只从它派生http://msdn.microsoft.com/en-us/library/z4c5tckx。aspx – thumbmunkeys

+0

然后,他可以从它派生出来并命名为'ArgumentInvalidFormatException',但名称并没有给它更多的可信性,即一个有用的'message',除非OP有一些更具体的情况来定义一个'invalid'参数。 –

+0

我知道,我会想到相同的,但只是说... – thumbmunkeys

2

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

+0

是的,我是那种摇摆不定实现这一但由于种种原因,它不适合很好(我给的代码只是一个正在发生的事情非常基本的版本)。我很希望有一个InvalidFormatException或者其他的东西,但是我怀疑它要么是一个ArgumentException,要么是一些自定义的东西。 –

2

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

0

System.ArgumentOutOfRangeException:当调用的方法和

ArgumentOutOfRangeException抛出在传递给方法的参数 至少一个不为空,并没有 不包含有效的值。

throw new ArgumentOutOfRangeException("payload","description of the specific problem"); 
相关问题