c # /. net에서 예외를 문서화하는 방법


139

현재 회사 내의 다른 개발자가 내부적으로 사용할 작은 프레임 워크를 작성하고 있습니다.

좋은 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()?

가능한 예외를 문서화하는 가장 좋은 방법은 무엇입니까?


4
나는 이것이 당신이 묻는 것이 아니라는 것을 알고 있습니다 (그리고 이것은 정말로 오래된 질문입니다). 그러나 Microsoft L # t (Microsoft C # 컴파일러 및 디자인 팀의 주요 개발자) 인 Eric Lippert는 모든 개발자가 생각하는 4 가지 유형의 예외에 대한 블로그 게시물을 작성했습니다 : 쓰기 예외 코드를 처리하는 동안에 대해 생각해야한다 blogs.msdn.com/b/ericlippert/archive/2008/09/10/...
javajavajavajavajava을

@javajavajavajavajava 링크를 읽어 주셔서 감사합니다.
Arnold Zokas

C #에서 예외를 올바르게 문서화하는 방법이 전혀 명확하지 않기 때문에 이것이 유효한 질문이라고 생각합니다 .50K 뷰는 많은 사람들에게도 명확하지 않다는 것을 보여줍니다. 두 번째로 많이 투표 된 답변은 기존 xmldoc을 사용하여이를 문서화하는 것으로 표시되므로 매우 유용합니다. 재개 투표. 이 "의견에 근거한"가까운 이유는 실제로 매우 유용한 프로그래밍 질문을 많이 죽이고 있습니다.
Alexei

답변:


110

호출 할 수있는 메소드의 예외를 포함하여 코드에서 발생할 수있는 모든 예외를 문서화해야합니다.

목록이 약간 커지면 자체 예외 유형을 만들 수 있습니다. 메소드 내에서 발생할 수있는 모든 것을 잡아서 예외로 감싸서 던지십시오.

이 방법으로 수행 할 수있는 또 다른 장소는 메소드가 API에있는 경우입니다. 파사드가 여러 인터페이스를 단일 인터페이스로 단순화하는 것처럼 API는 여러 예외를 단일 예외로 단순화해야합니다. 발신자가 더 쉽게 코드를 사용할 수 있습니다.


Andrew의 우려에 대한 답변 (댓글)에는 세 가지 유형의 예외가 있습니다. 알지 못하는 것, 알지 못하고 할 수없는 것, 알거나 할 수있는 것에는 예외가 있습니다.

당신이 모르는 사람들은 떠나고 싶어합니다. 빠른 실패의 원칙은 데이터가 손상 될 수있는 상태에 들어가는 것보다 앱이 중단되는 것보다 낫습니다. 충돌은 발생한 상황과 이유를 알려주며 "알지 못하는 사람"목록에서 해당 예외를 제거하는 데 도움이 될 수 있습니다.

당신이 알고 있고 할 수없는 것은 OutOfMemoryExceptions와 같은 예외입니다. 극단적 인 경우에는 이와 같은 예외를 처리하고 싶을 수도 있지만, 매우 놀라운 요구 사항이 없으면 예외를 첫 번째 범주처럼 취급해야합니다. 당신 은 가지고 있습니까 이러한 예외를 문서화? 객체를 새로 만드는 모든 단일 메소드에서 OOM을 문서화하는 것은 어리석은 것처럼 보일 것입니다.

당신이 알고 있고 할 수있는 것은 문서화하고 포장해야하는 것들입니다.

예외 처리에 대한 추가 지침은 여기에서 찾을 수 있습니다 .


3
나는 이것이 실용적이지 않다는 것을 인정해야한다. 내가 호출 할 수있는 코드로 몇 가지 잠재적 인 예외가 발생할 수 있는지 상상할 수 없으며 OutOfMemoryException과 같은 것들을 잡고 감싸고 싶지 않습니다.
Andrew Hare

3
대답은 좋을지 모르지만 실제로는 서로 상충되는 두 가지 대답입니다. "코드에 의해 발생할 수있는 모든 예외를 문서화하십시오"및 "알고 있고 할 수있는 것은 문서화해야 할 예외입니다."
tymtam

2
@Tymek : 아뇨. 전반부는 "예외를 어떻게 문서화해야합니까?"라는 질문에 답했고, 두 번째 부분은 "어떤 예외를 문서화해야하는지"에 대한 명백한 대답을 지적했습니다. 첫 번째는 발생할 수있는 모든 예외를 문서화한다는 의미는 아닙니다. 어떤 사람들은 말 그대로 너무 후반이 필요했습니다.

5
@Tymek 나는 당신이 그것에 대해 무언가를 할 수 있다면 그것을 다시 던지고 문서화하는 대신 그것에 대해 무언가를하지 않는 것이 중요하다고 생각합니다. " 클라이언트 코드가 무언가를 할 수 있다는 것을 알고있는 사람들"이라고 말하는 것이 더 진실 일 수 있습니다 . 문서화에 이상적인 예외이기 때문에 모순을 제거합니다.
mo.

당신이 '가자'는 예외에 관해서는, 당신은 항상 그것들을 기록하는 하위 레벨에서 그들을 잡을 수 있습니다. 당신은 알고있다; 사용자 친화적 인 방식으로 프로그램이 중단되도록합니다.
Nyerguds

96

표준 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를 사용하는 경우 인텔리전스로 제공되며 나중에 예상 할 수있는 예외를 상기시킬 수 있습니다.

한 가지 유형의 예외를 처리 할 수있는 반면 다른 유형은 심각한 문제의 결과이므로 수정할 수 없으므로 특정 예외 유형을 지정하려고합니다.


1
그것은 어떻게 가치를 추가합니까? 예를 들어, 이러한 모든 예외는 예외 유형의 파생입니다. 내 경험상 메소드 내에서 호출 된 다른 API에서 발생할 수있는 다른 모든 예외 유형을 생각하는 것은 실용적이지 않습니다. 요점은 비즈니스 정보를 전달하는 것보다 방법에서 발생하는 예외에 대해 걱정해서는 안된다는 것입니다.
Illuminati

7
@ ShiranGinige 당신의 경험이 잘못되었습니다.
Grozz

35

몇 가지 훌륭한 추가 기능을 사용하여 문서 프로세스를보다 쉽게 ​​만들 수 있습니다. 그중 하나가 XML 문서 주석을 생성하는 Visual Studio 용 무료 애드 인 GhostDoc 입니다. 또한 ReSharper 를 사용하는 경우 예외가 발생했을 때 XML 주석을 생성하는 옵션이 추가 된 뛰어난 ReSharper 용 Agent Johnson 플러그인 을 살펴보십시오 .

업데이트 : 카발라 존슨 R # 8을 사용할 수없는 것으로 보인다는 체크 아웃 ReSharper에서 탁월한 대안으로 ...

1 단계 : GhostDoc은 XML 주석 (Ctrl-Shift-D)을 생성하는 반면 ReSharper 용 에이전트 Johnson 플러그인은 예외 문서화도 제안합니다.

1 단계

2 단계 : ReSharper의 바로 가기 키 (Alt-Enter)를 사용하여 예외 문서를 추가하십시오.

2 단계 http://i41.tinypic.com/osdhm

희망이 있습니다 :)


작은 링크가 끊어졌습니다.
ANeves

11

내가 이해 한 것에서 <exception> 요소를 사용하려는 의도는 예외가 아닌 메소드를 장식 할 때 사용하는 것입니다.

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

호출 된 다른 메소드에서 발생할 수있는 예외는 해당 메소드에서 포착, 처리 및 문서화되어야합니다. .NET에서 발생할 수있는 예외 또는 사용자 고유 코드에서 명시 적으로 발생한 예외를 문서화해야합니다.

그것보다 더 구체적으로하는 한, 당신은 아마도 자신만의 맞춤형 예외를 잡을 수 있습니까?


4

방법에 대한 계약의 일부는 전제 조건이 유효한지 확인하는 것입니다.

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 가능성 등을 문서화하지 않고도 명시 적으로 던지는 모든 예외를 문서화하는 것이 더 쉽습니다 .


1
Open호출이 어쨌든 던질 것이라는 예외를 복제하려고한다면 그 점검의 요점을 확실 하지 않습니다 (경쟁이 있고 점검이 성공을 보장하지는 않습니다 Open). .
매트 엔 라이트

1
@MattEnright 그랜트, 그러나 나는 이것을 요점을 설명하기 위해 약간 고안했다 ...
Rowland Shaw

1

메소드에서 발생할 수있는 모든 예외를 문서화해야합니다.

구현 세부 사항을 숨기려면 MyMethod2의 일부 예외를 직접 처리하려고합니다.

예외를 처리하거나 해결할 수없는 경우 레트로 윙을 고려할 수 있습니다. 대부분의 경우 호출자에게 더 의미있는 예외로 패키지 / 랩핑됩니다.


1

실제로 이미 답변을 마쳤으므로 예외를 문서화하는 방법은 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

문안 인사.


0

메소드에 예상되는 예외를 문서화하십시오. 예제에서 해당 메소드가 파일을 찾을 수 없음 예외를 던질 수 있음을 사용자에게 알려줍니다.

발신자에게 처리 방법을 선택할 수 있도록 예상 대상을 알려주는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.