Какое исключение выбрасывать при разборе массива байтов? (С #) - PullRequest
4 голосов
/ 24 августа 2011

Я анализирую байтовый массив, который фактически является записью фиксированной длины, отправляемой по шине сообщений.Если данные недействительны (искажены или не соответствуют спецификации записи), я хочу выдать исключение.Примерно так:

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

    ...do creation of domain object
}

Кто-нибудь знает, есть ли хорошее стандартное исключение, которое я могу выбросить в этих обстоятельствах, или я должен просто создать свое собственное конкретное исключение?

Ответы [ 4 ]

3 голосов
/ 24 августа 2011

Вы можете просто использовать ArgumentException:

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

Как указано ниже x0r, MSDN рекомендует только исходя из ArgumentException, так как можетили может не дать вам никакой дополнительной ценности, это зависит от того, что определяет «недопустимый» аргумент, передаваемый через параметр - если вы можете определить строгие правила того, что может пойти не так, то вы можете получить выгоду от создания более точно названных исключений, которые происходят изArgumentException.

Или вы можете использовать InvalidDataException с таким же информационным сообщением, если оно есть:

Исключение, которое являетсягенерируется, когда поток данных имеет недопустимый формат.

Хотя имеется в виду поток данных, может быть некоторыми возражениями - давайте посмотрим.

Если этопросто для общего исключения «плохого формата», тогда у вас есть FormatException - но это может быть faaar слишком общим для ваших обстоятельств (см. выше), хотя, возможно, далекоЛучшее исключение для получения, оно действительно зависит:

Исключение, которое выдается, когда формат аргумента не соответствует спецификациям параметров вызванного метода.

2 голосов
/ 24 августа 2011

Если критерий достоверности данных зависит от приложения и не соответствует какому-либо общему случаю (например, индекс вне диапазона и т. Д.), Я думаю, что лучше использовать собственное исключение. Для стандартного случая используйте существующее исключение, например, NullPointerException, если payload == null.

2 голосов
/ 24 августа 2011

Вы можете выдать ArgumentException с пользовательским InnerException.

0 голосов
/ 24 августа 2011

System.значение.

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