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

Я действительно работаю над разработкой Framework, а это означает, что вам нужна действительно сильная методология кодирования.

У меня возникла проблема, когда я не знаю, какой класс, порожденный System.Exception, мне нужно бросить. В основном это случай, когда у меня есть класс с полями, которые могут быть optionnaly инициализированы конструктором и которые имеют методы, использующие эти поля. Какое исключение я должен выполнить, если пользователь не инициализировал эти поля? (что означает, что они равны нулю)

Вот пример:

public class MyConnection
{
 private Uri endpointUri;
 public Uri EndpointUri
 {
 get
 {
 return this.endpointUri;
 }
 set
 {
 this.endpointUri = value;
 }
 }
 public MyConnection()
 {
 }
 public MyConnection(Uri endpointUri)
 {
 this.endpointUri = endpointUri;
 }
 public FileStream GetFile()
 {
 if (this.endpointUri != null)
 {
 // My doer methods
 }
 else
 {
 throw new TheExceptionINeedToThrow("endpointUri", ...);
 } 
 }
}

Обратите внимание, что я читал целую главу "Руководство по дизайну рамок" в отношении обработки и метаданных исключений и что я не нашел подходящего решения этот точный случай. Или, может быть, я что-то не понял...

Спасибо за вашу помощь.

EDIT: факт, что я предоставляю пустой конструктор, кажется немного запутанным в отношении моей проблемы, но он полностью добровольный. В некоторых объектах, которые должны соответствовать диапазону различных состояний, которые не могут быть дублированы в нескольких объектах, иногда полезно.

3 ответа

Throw InvalidOperationException:

Исключение, которое вызывается, когда вызов метода недействителен для текущего состояния объекта.

Обратите внимание, что нулевая ссылка не передается в метод - она ​​уже существует при вызове метода - поэтому это текущее состояние объекта является недопустимым, а не аргументом.

Однако было бы лучше предотвратить создание объекта таким образом, чтобы начать, если это вообще возможно, - это должно быть свойство записи? Вы когда-нибудь захотите, чтобы экземпляр имел нулевой конечный URI?


NullReferenceException, InvalidArgumentExecption или ApplicationException все будет в порядке, если в описании исключения явно указано, что это пустое.


Как и другие, я рекомендую InvalidOperationException (потому что Джон Скит сказал это):)

если вы вызываете функцию с нулевым параметром, я буду использовать

ArgumentNullException

licensed under cc by-sa 3.0 with attribution.