C#에서 예외를 다시 반환 할 수있는 기능을 자동으로 확인하는 방법

StackOverflow https://stackoverflow.com/questions/915941

  •  06-09-2019
  •  | 
  •  

문제

예외를 제외하고 시도/잡지 않은 방법에서 디버거에서 코드 충돌을 보는 것보다 더 실망스러운 것은 없습니다.

소스를 스캔하고 잠재적으로 예외를 던질 수있는 모든 기능을 태그하는 쉬운 방법이 있습니까?

Visual Assist의 빌드에는 이러한 기능을 특정 색상으로 색칠하는 숨겨진 옵션이 있습니까?

감사해요

아르 자형

도움이 되었습니까?

해결책

Redgate는이 "예외 사냥꾼"을위한 도구가 있다고 생각합니다.

http://www.red-gate.com/products/exception_hunter/index.htm

다른 팁

가장 사소한 모든 코드는 예외를 제외 할 수 있습니다 (최소한 기억이 나지 않습니다). 코드의 섹션이 예외를 제외하거나 던질 수없는 미세 관리를 시도하기보다는 적어도 글로벌 시도/캐치로 코드를 방어 적으로 작성하는 것이 좋습니다.

아니요,이를 자동으로 수행 할 수있는 방법이 없으며 방법으로 던져진 모든 가능한 예외 목록을 얻는 좋은 방법도 없습니다. 다음은 몇 가지 이유가 있습니다

  1. stackoverflowexception과 같은 암시 적으로 예외를 제외하고 모든 방법에서 언제든지 던질 수 있습니다. CLR의 모든 방법이 이러한 유형의 예외를 던질 수 있다고 가정해야합니다.
  2. 반사 및 / 또는 대의원은 특정 메소드에서 호출되는 실제 코드를 숨길 수 있으므로 메소드의 가능한 모든 코드 경로를 검사 할 수 없습니다.
  3. IL 대 메타 데이터를 검사해야합니다.
  4. .NET에는 API가 명시 적으로 던지는 예외를 문서화 할 필요가 없습니다.

다른 사람들이 말했듯이, C# 에서이 작업을 수행하는 방법을 찾을 수 있는지 확실하지 않습니다. 확인 된 예외를 지원하지 않기 때문입니다.

약간의 옆으로, 이것은 Anders Hejlsberg와의 인터뷰를 상기시켜주었습니다. "확인 된 예외 문제". 나는 예외를 확인하려고하지는 않지만 C#의 예외 설계 뒤에있는 Ander의 근거를 읽고 예외를 처리하기위한 제안 된 방법 : 중앙 집중식 예외 처리.

resharper가 예외에 대한 힌트를 제공한다고 생각합니다. 그러나 C#이 확인 된 예외를 지원하지 않는 이유 때문에 예외를 결정하는 방법이 있습니다. NDEPOL과 같은 코드 분석 도구가 이것을 지원할 수 있습니다.

모든 것이 예외를 던질 수 있습니다. MSDN에서 메소드에 의해 던질 수있는 예외 목록을 확인하십시오.

비어 있지 않은 모든 방법은 어떤 형태로든 예외를 제외 할 수 있습니다. 개인적으로 생성 한 예외가 걱정된다면 XML 문서를 통해 프레임 워크 방법을 수행하는 것과 같은 방식으로 Intellisense에서 표시 할 수 있습니다.

/// <summary>  
/// I seem to have written a method to do a thing.
/// </summary>  
/// <exception cref="System.Exception">An unfortunate failure.</exception>
public void DoSomething()
{
   /* ... */
}

모든 코드는 잠재적으로 예외를 유발할 수 있습니다.

FXCOP와 같은 일반적인 오류를 찾는 데 도움이 될 수있는 여러 타사 도구가 있으며 Refactor와 같은 도구가 제안을 할 수 있습니다.

잠재적 예외를 찾는 데 도움이되는 현재 작업이 수행되었습니다. 기능에 대한 테스트를 생성하는 데 도움이되는 PEX를 살펴보십시오 : research.microsoft.com/en-us/projects/pex/ (게시시 링크가 다운 된 것 같습니다).

또 다른 흥미로운 영역은 코드 계약입니다 (.NET 4/SPEC#로 제공). 코드 계약을 통해 충족해야 할 조건을 지정하는 진술을 작성할 수 있습니다. 이들은 기능을 호출하기 전과 후에 가능하며 불변을 선언 할 수도 있습니다. 조건은 값만큼 단순한 것일 수 있습니다! = null. 그런 다음 이러한 조건은 컴파일 및 런타임에서 분석하여 코드 경로를 위반하지 않습니다.

다른 사람들이 말했듯이, 당신은 당신이 할 수 없다는 것을 증명하지 않는 한, 모든 단일 코드 라인이 예외를 던질 수 있다고 가정해야합니다. 더 좋은 질문은 "당신은 그것에 대해 무엇을 할 계획입니까?"입니다.

일반적으로 예외를 전혀 포착해서는 안됩니다.

물론, 다른 모든 것은 그 규칙에 대한 예외입니다. 로그인하기 위해 예외를 포착하는 것이 합리적입니다 (ASP.NET처럼 환경이 귀하를 위해 그렇게하지 않는 경우). 컨텍스트에 대한 자세한 내용을 제공하는 또 다른 예외로 대체하기 위해 예외를 포착하는 것이 합리적입니다.

public int GetConfiguredInteger(string name) {
    string s = null;
    try {
        s = GetStringFromConfigFile(name);
    }
    catch (IOException ex) {
        throw new Exception(String.Format(
            "Error in configuration file foo.config when processing {0}", name),
            ex);
    }
    return int.Parse(s);
}

발신자는 IOException이 구성 파일에 의해 발생했음을 알 수 없었습니다. 또한 파일 I/O와 관련이없는 모든 예외를 무시한 방법도 참고하십시오. 특히 int.parse는 시도/캐치 블록 내부에도 안됩니다.

이러한 예외는 적은 수의 예외가 있지만 예외를 포착하는 기본 아이디어는 다음과 같습니다.

반사기 추가가 있습니다 예외 파인더 방법으로 어떤 예외가 발생할 수 있는지 보여줍니다. 나는 그것을 사용하지 않았지만 .NET 사용자 그룹 회의에서 그 예를 보았습니다.

이를 수행 할 수있는 도구가 있습니다. 시험을 다운로드하고 좋아하는지 확인할 수 있습니다. 나는 그것이 그것이 필요하다고 생각하지는 않지만, 당신이 회사에서 일하고 있고 그들이 그것을 지불 할 것이라면 그것을 조사하고 싶을 것입니다. 제기 될 예외가 너무 많기 전에 말한 것과 마찬가지로. 체크 아웃 실증 된 사냥꾼

소수의 사람들이 언급 한 예외 헌터는이를 도울 수있는 좋은 도구입니다. 나는 그것이 넥타이를 가지고 있는지 모른다. <exception> XML-DOC 주석으로 코드로 던져진 예외의 문서를 시행 할 수 있습니다.

외부 캐치 블록 안에서 부러 뜨리고 예외가 일어난 실제 지점까지 내 길을 파는 것이 훨씬 더 실망 스럽습니다.

대부분의 시간은 예외가 발생하고 그것을 기대하지 않았다면 나는 버그를 발견했으며, 어떤 일을하지 않는 예외 처리로 인해 난독 화되지 않으면 그것을 해결하기가 더 쉽습니다.

편집하다:당신의 예는 실제로 좋은 예이기 때문에 나는 여전히 그러한 도구가 당신을 도울 것이라고 확신하지 않습니다. 문자 그대로 모든 코드 라인이 던질 수 있도록 가능한 많은 예외가있을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top