Как документировать выданные исключения в c# / .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()
?
как лучше всего документировать возможные исключения?
8 ответов:
вы должны документировать каждое исключение, которое может быть вызвано вашим кодом, в том числе в любых методах, которые вы можете вызвать.
Если список становится немного Большой, вы можете создать свой собственный тип исключения. Поймайте все те, с которыми вы можете столкнуться в своем методе, оберните их в свое исключение и бросьте его.
другое место, где вы можете сделать это таким образом, если ваш метод находится на лице вашего API. Так же, как фасад упрощает несколько интерфейсов в один интерфейс, ваш API должен упростить несколько исключений в одно исключение. Делает использование кода проще для абонентов.
те, о которых вы не знаете, вы хотите отпустить. Его принцип неудачи быстро-лучше ваш приложение для сбоя, чем ввести состояние, в котором вы можете в конечном итоге повредить ваши данные. Сбой расскажет вам о том, что произошло и почему, что может помочь переместить это исключение из списка "те, о которых вы не знаете".
те, о которых вы знаете и ничего не можете сделать, являются исключениями, такими как OutOfMemoryExceptions. В крайних случаях вы можете захотеть обрабатывать исключения, подобные этому, но если у вас нет довольно замечательных требований, вы относитесь к ним как к первой категории-отпустите их. А ты есть документировать эти исключения? Вы бы выглядели довольно глупо, документируя OOMs на каждом отдельном методе, который создает новый объект.
те, о которых вы знаете и можете что-то сделать, - это те, которые вы должны документировать и упаковывать.
вы можете найти рекомендации по обработке исключений здесь.
вы должны использовать стандартная xml-документация.
/// <exception cref="InvalidOperationException">Why it's thrown.</exception> /// <exception cref="FileNotFoundException">Why it's thrown.</exception> /// <exception cref="DivideByZeroException">Why it's thrown.</exception> public void MyMethod1() { MyMethod2(); // ... other stuff here } /// <exception cref="FileNotFoundException">Why it's thrown.</exception> /// <exception cref="DivideByZeroException">Why it's thrown.</exception> public void MyMethod2() { System.IO.File.Open(somepath...); } /// <exception cref="FileNotFoundException">Why it's thrown.</exception> public void MyMethod3() { try { MyMethod2(); } catch (DivideByZeroException ex) { Trace.Warning("We tried to divide by zero, but we can continue."); } }
значение в этом случае заключается в том, что вы предоставляете документацию об известных исключениях, которые могут возникнуть. Эта документация доступна в intellisense, если вы используете visual studio, и может напомнить вам (или другим) позже об исключениях, которые вы можете ожидать.
вы хотите указать конкретные типы исключений, потому что вы можете обрабатывать один тип исключения, в то время как другие типы являются результатом серьезной проблемы и не могут быть исправлены.
вы можете сделать ваш процесс документации проще с помощью нескольких больших надстроек. Один из них -GhostDoc, бесплатная надстройка для Visual Studio, которая генерирует комментарии XML-doc. Кроме того, если вы используете для ReSharper, взгляните на отличные Агент Джонсон Плагин для ReSharper, который добавляет возможность генерировать комментарии XML для брошенных исключений.
обновление: похоже, что Agen Johnson недоступен для R# 8, checkout исключительный для ReSharper в качестве альтернативы...
Шаг 1: GhostDoc генерирует XML комментарий (Ctrl-Shift-D), в то время как агент Джонсон плагин для ReSharper предлагает документировать исключение также:
Шаг 1 http://i44.tinypic.com/bdwsk0.png
Шаг 2: используйте комбинацию клавиш ReSharper (Alt-Enter) для добавления исключения документация также:
Шаг 2 http://i41.tinypic.com/osdhm
надеюсь, что это поможет:)
из того, что я понимаю, намерение использовать элемент
состоит в том, чтобы использовать его при оформлении методов, а не исключений: /// <summary>Does something!</summary> /// <exception cref="DidNothingException">Thrown if nothing is actually done.</exception> public void DoSomething() { // There be logic here }
исключения, которые могут быть вызваны другими вызываемыми методами, должны быть перехвачены, обработаны и задокументированы в этих методах. Исключения, которые могут быть вызваны .NET, или исключения, которые явно брошенный вашим собственным кодом должен быть задокументирован.
что касается получения более конкретной информации, возможно вы можете поймать и бросить свои собственные исключения?
частью контракта для вашего метода должна быть проверка того, что предварительные условия действительны, поэтому:
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 }
при таком подходе проще документировать все исключения, которые вы явно бросаете, без необходимости также документировать, что a
OutOfMemoryException
может быть брошенным и т. д.
вы должны документировать все исключения, которые могут быть вызваны вашим методом.
чтобы скрыть детали реализации, я бы попытался обработать некоторые исключения из MyMethod2 сам.
вы можете рассмотреть возможность их повторного использования, если вы не можете обработать или решить исключение. В основном упакованы / обернуты в более значимое исключение для вызывающего абонента.
действительно, как уже было сказано, способ документирования исключений-это использование комментариев 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
с уважением.