Атрибут для информирования вызывающего метода о типе исключений, создаваемых этим методом

Я не собираюсь реализовывать ключевое слово Java "throws". См. http://www.artima.com/intv/handcuffsP.html для обсуждения достоинств ключевого слова throws и почему оно не было реализовано в С#.

Мне, однако, любопытно, есть ли способ создать атрибут, подобный следующему:

[ThrowsException( exceptionType = NullReferenceException )] 
[ThrowsException( exceptionType = AuthenticationException )]
public void Login( Credentials credz ) 
{
    // ... etc...
}

такой, что - при вызове метода, который был украшен одним или несколькими атрибутами ThrowsException, тип исключений, вызванных указанным методом (по крайней мере, тех, которые явно объявлены атрибутом ThrowsException), будет виден в документации метода

Это не то же самое, что ключевое слово "throws" Java, так как оно не требует, чтобы вызывающая сторона обрабатывала эти исключения. Это может привести к серьезным изменениям, например, в клиентском приложении, которое не обрабатывает новые исключения, вызванные изменением версии.

В то время как можно использовать:

/// <exception cref="member">description</exception>

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


Обновление: 2013-05-23

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

Так как я не смогу обойти это до понедельника, я предлагаю вознаграждение, если вы можете победить меня - приемлемый ответ:

  • (не включает использование подключаемого модуля Visual Studio или любого стороннего инструмента
  • & Amp; & Amp; предоставить способ включить исключение (я) в документацию XML
  • & Amp; & Amp; обеспечить безопасность типов во время компиляции)
  • || доказать, что невозможно выполнить предыдущие три требования, чтобы обеспечить решение проблемы, поставленной в этом вопросе

Я считаю приемлемым, чтобы документация XML не отражала исключения из атрибутов ThrowsException до тех пор, пока проект не будет собран.

Было бы интересно увидеть решение на основе Resharper (поскольку оно является общим для большинства мастерских разработчиков, в которых я работал), но оно не будет принято, если есть решение, которое остается независимым от сторонних инструментов. Аналогично, решение, которое работает только в Visual Studio, будет принято поверх решения, зависящего от Resharper, но оно не будет принято, если есть решение, которое будет работать в других средах разработки, например. MonoDevelop (больше поддерживаемых фреймворков - еще лучше).

Ответ 1

Мое намерение использовать атрибуты заключается в том, что проект не компилируется если имя исключения было изменено или если исключение нет дольше существует. Поэтому, как документировать выброшенные исключения, НЕ тот же вопрос.

Вы можете сделать это без использования атрибутов, вместо этого напишите <exception> документацию и настроив свой проект следующим образом:

Project properties -> 'Build' tab:
'Output' section: Check 'XML documentation file'.
'Treat warnings as erros' section: Check 'Specific warnings' and add warning 1574.

Этот способ не будет компилироваться, если значение атрибута XML cref не может быть разрешено.

Ответ 2

В С# вы документируете классы и их члены с XML-документацией. В Visual Studio начните вводить косые черты над чем-то и третьим косой чертой, это автоматически сгенерирует наиболее распространенные теги для заполнения. Это выглядит неопределенно, как Javadoc и JSDoc.

Вы ищете, в частности, этот тег.

Ответ 3

Ниже должно работать

[ThrowsException( ExceptionType = typeof(NullReferenceException) )]

У вашего атрибута будет свойство типа Type

Type ExceptionType { get; set; }