현재 회사 내의 다른 개발자가 내부적으로 사용할 작은 프레임 워크를 작성하고 있습니다.
좋은 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()
?
가능한 예외를 문서화하는 가장 좋은 방법은 무엇입니까?
답변
호출 할 수있는 메소드의 예외를 포함하여 코드에서 발생할 수있는 모든 예외를 문서화해야합니다.
목록이 약간 커지면 자체 예외 유형을 만들 수 있습니다. 메소드 내에서 발생할 수있는 모든 것을 잡아서 예외로 감싸서 던지십시오.
이 방법으로 수행 할 수있는 또 다른 장소는 메소드가 API에있는 경우입니다. 파사드가 여러 인터페이스를 단일 인터페이스로 단순화하는 것처럼 API는 여러 예외를 단일 예외로 단순화해야합니다. 발신자가 더 쉽게 코드를 사용할 수 있습니다.
Andrew의 우려에 대한 답변 (댓글)에는 세 가지 유형의 예외가 있습니다. 알지 못하는 것, 알지 못하고 할 수없는 것, 알거나 할 수있는 것에는 예외가 있습니다.
당신이 모르는 사람들은 떠나고 싶어합니다. 빠른 실패의 원칙은 데이터가 손상 될 수있는 상태에 들어가는 것보다 앱이 중단되는 것보다 낫습니다. 충돌은 발생한 상황과 이유를 알려주며 “알지 못하는 사람”목록에서 해당 예외를 제거하는 데 도움이 될 수 있습니다.
당신이 알고 있고 할 수없는 것은 OutOfMemoryExceptions와 같은 예외입니다. 극단적 인 경우에는 이와 같은 예외를 처리하고 싶을 수도 있지만, 매우 놀라운 요구 사항이 없으면 예외를 첫 번째 범주처럼 취급해야합니다. 당신 은 가지고 있습니까 이러한 예외를 문서화? 객체를 새로 만드는 모든 단일 메소드에서 OOM을 문서화하는 것은 어리석은 것처럼 보일 것입니다.
당신이 알고 있고 할 수있는 것은 문서화하고 포장해야하는 것들입니다.
예외 처리에 대한 추가 지침은 여기에서 찾을 수 있습니다 .
답변
표준 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.");
}
}
이 방법으로 수행 할 수있는 값은 발생할 수있는 알려진 예외에 대한 문서를 제공한다는 것입니다. 이 문서는 Visual Studio를 사용하는 경우 인텔리전스로 제공되며 나중에 예상 할 수있는 예외를 상기시킬 수 있습니다.
한 가지 유형의 예외를 처리 할 수있는 반면 다른 유형은 심각한 문제의 결과이므로 수정할 수 없으므로 특정 예외 유형을 지정하려고합니다.
답변
몇 가지 훌륭한 추가 기능을 사용하여 문서 프로세스를보다 쉽게 만들 수 있습니다. 그중 하나가 XML 문서 주석을 생성하는 Visual Studio 용 무료 애드 인 GhostDoc 입니다. 또한 ReSharper 를 사용하는 경우 예외가 발생했을 때 XML 주석을 생성하는 옵션이 추가 된 뛰어난 ReSharper 용 Agent Johnson 플러그인 을 살펴보십시오 .
업데이트 : 카발라 존슨 R # 8을 사용할 수없는 것으로 보인다는 체크 아웃 ReSharper에서 탁월한 대안으로 …
1 단계 : GhostDoc은 XML 주석 (Ctrl-Shift-D)을 생성하는 반면 ReSharper 용 에이전트 Johnson 플러그인은 예외 문서화도 제안합니다.
2 단계 : ReSharper의 바로 가기 키 (Alt-Enter)를 사용하여 예외 문서를 추가하십시오.
2 단계 http://i41.tinypic.com/osdhm
희망이 있습니다 🙂
답변
내가 이해 한 것에서 <exception> 요소를 사용하려는 의도는 예외가 아닌 메소드를 장식 할 때 사용하는 것입니다.
/// <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
}
이 방법을 사용하면 발생 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 -의견-예외 -II.aspx
문안 인사.