Как документировать выброшенные исключения в С#/. Net

В настоящее время я пишу небольшую структуру, которая будет использоваться внутри других разработчиков внутри компании.

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

В следующем примере:

public void MyMethod1()
{
    MyMethod2();

    // also may throw InvalidOperationException
}

public void MyMethod2()
{
    System.IO.File.Open(somepath...); // this may throw FileNotFoundException

    // also may throw DivideByZeroException
}

Я знаю, что разметка для документирования исключений:

/// <exception cref="SomeException">when things go wrong.</exception>

Я не понимаю, как документировать исключения, создаваемые кодом , вызываемым MyMethod1()?

  • Должен ли я документировать исключения, сброшенные MyMethod2()
  • Должен ли я документировать исключения, отбрасываемые File.Open()?

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

Ответ 1

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

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

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


Чтобы ответить на некоторые из проблем Эндрю (из комментариев), существует три типа исключений: о вас, о которых вы не знаете, о тех, о которых знаете и которые не можете что-либо сделать, и о тех, о которых вы знаете и можете делать что-то о.

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

Те, о которых вы знаете, и не можете ничего сделать, - это исключения, такие как OutOfMemoryExceptions. В крайних случаях вы, возможно, захотите обрабатывать такие исключения, но если у вас нет каких-то довольно замечательных требований, вы относитесь к ним как к первой категории - пусть они уйдут. Вам нужно документировать эти исключения? Вы бы выглядели довольно глупо, документируя OOM по каждому методу, что новый объект.

Те, о которых вы знаете и можете что-то сделать, - это те, которые вы должны документировать и обертывать.

Здесь вы можете найти еще рекомендации по обработке исключений.

Ответ 2

Вы должны использовать стандартную XML-документа .

/// <exception cref="InvalidOperationException">Why it thrown.</exception>
/// <exception cref="FileNotFoundException">Why it thrown.</exception>
/// <exception cref="DivideByZeroException">Why it thrown.</exception>
public void MyMethod1()
{
    MyMethod2();
    // ... other stuff here
}

/// <exception cref="FileNotFoundException">Why it thrown.</exception>
/// <exception cref="DivideByZeroException">Why it thrown.</exception>
public void MyMethod2()
{
    System.IO.File.Open(somepath...);
}

/// <exception cref="FileNotFoundException">Why it thrown.</exception>
public void MyMethod3()
{
    try
    {
        MyMethod2();
    }
    catch (DivideByZeroException ex)
    {
        Trace.Warning("We tried to divide by zero, but we can continue.");
    }
}

Значение при этом заключается в том, что вы предоставляете документацию об известных исключениях, которые могут произойти. Эта документация доступна в intellisense, если вы используете визуальную студию и можете напомнить вам (или другим) о тех исключениях, которые вы можете ожидать.

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

Ответ 3

Вы можете упростить процесс документирования, используя несколько замечательных надстроек. Одним из них является GhostDoc, бесплатная надстройка для Visual Studio, которая генерирует комментарии XML-doc. Кроме того, если вы используете ReSharper, посмотрите на отличный агент Johnson Plugin для ReSharper, который добавляет возможность генерировать комментарии XML для исключенных исключений.

Обновление: Кажется, что Agen Johnson недоступен для R # 8, checkout Исключительно для ReSharper в качестве альтернатива...

Шаг 1: GhostDoc генерирует XML комментарий (Ctrl-Shift-D), а плагин Agent Johnson для ReSharper предлагается документировать исключение:

шаг 1 http://i44.tinypic.com/bdwsk0.png

Шаг 2: Используйте горячую клавишу ReSharper (Alt-Enter), чтобы добавить исключение документация:

шаг 2 http://i41.tinypic.com/osdhm

Надеюсь, что помогает:)

Ответ 4

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

/// <summary>Does something!</summary>
/// <exception cref="DidNothingException">Thrown if nothing is actually done.</exception>
public void DoSomething()
{
// There be logic here
}

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

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

Ответ 5

Часть контракта для вашего метода должна состоять в том, чтобы проверить, что предварительные условия действительны, поэтому:

public void MyMethod2()
{
    System.IO.File.Open(somepath...); // this may throw FileNotFoundException
}

становится

/// <exception cref="FileNotFoundException">Thrown when somepath isn't a real file.</exception>
public void MyMethod2()
{
    FileInfo fi = new FileInfo( somepath );
    if( !fi.Exists )
    {
        throw new FileNotFoundException("somepath doesn't exists")
    }
    // Maybe go on to check you have permissions to read from it.

    System.IO.File.Open(somepath...); // this may still throw FileNotFoundException though
}

При таком подходе легче документировать все исключения, которые вы явно бросаете, не имея необходимости также документировать, что может быть выброшено OutOfMemoryException и т.д.

Ответ 6

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

Чтобы скрыть детали реализации, я попытался бы обработать некоторые исключения из MyMethod2 самостоятельно.

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

Ответ 7

Действительно, как уже было сказано, способ документировать исключения - это использование комментариев XML.

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

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

http://www.josefcobonnin.com/post/2009/01/11/Xml-Documentation-Comments-Exceptions-I.aspx http://www.josefcobonnin.com/post/2009/01/15/Xml-Documentation-Comments-Exceptions-II.aspx

С уважением.

Ответ 8

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

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