Resharper가 왜 '단일'던지기 '진술을 가진 Catch Clause'라고 말하는 이유는 무엇입니까?

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

문제

나는 예외를 던지는 것이 UI로 거품이 나거나 예외를 기록하고 사용자에게 알리는 곳으로 거품을 일으키는 좋은 관행이라고 생각했습니다.

Resharper가 왜 중복되었다고 말합니까?

try
{
    File.Open("FileNotFound.txt", FileMode.Open);
}
catch
{
    throw;
}
도움이 되었습니까?

해결책

왜냐하면

try {
    File.Open("FileNotFound.txt", FileMode.Open);
} catch {
    throw;
}

다르지 않습니다

File.Open("FileNotFound.txt", FileMode.Open);

전화를 한 경우 File.Open(string, FileMode) 실패, 두 샘플에서 정확히 동일한 예외는 UI에 이르기까지 찾을 수 있습니다.

그것에 catch 위의 조항은 로깅, 거래 롤백, 추가 정보를 추가하여 예외를 마무리하거나 전혀 예외를 마무리하지 않고 예외를 잡아서 다시 던지는 것입니다.

하지만,

try {
    File.Open("FileNotFound.txt", FileMode.Open);
} catch(Exception ex) {
    GetLogger().LogException(ex);
    throw;
}

중복성이 포함되어 있지 않으며 resharper는 불만을 제기해서는 안됩니다. 비슷하게,

try {
    File.Open("FileNotFound.txt", FileMode.Open);
} catch(Exception ex) {
    throw new MyApplicationException(
        "I'm sorry, but your preferences file could not be found.", ex);
}

중복되지 않습니다.

다른 팁

위의 진술은 그것이없는 것처럼 동일한 행동을 가지고 있기 때문입니다. 글쓰기와 동일 :

File.Open("FileNotFound.txt", FileMode.Open);

시도의 코드는 이미 예외를 던지고 있기 때문입니다.

예외를 다시 던지는 것 외에도 캐치 블록에서 다른 일을하려는 경우에만 잡히고 예외를 다시 제외하고 싶을 것입니다.

중복되어 있기 때문입니다.

캐치 블록에서 처리를 수행하지 않았으며 예외를 다시 던졌습니다.

시도해 볼 필요가 없기 때문에 경고합니다.

또한 또 다른 좋은 팁은 "Throw Ex"가 스택 추적을 보존하지 않고 "던지기"는 의지한다는 것입니다.

그 동안 주목할 가치가 있습니다 ...

try
{
    DoSomething();
}
catch
{
    throw;
}

... reduntant입니다. 다음은 아닙니다 ...

try
{
    DoSomething();
}
catch (Exception ex)
{
    // Generally a very bad idea!
    throw ex;
}

이 두 번째 코드 스 니펫은 몇 개의 프로젝트를 물려받은 코드베이스를 통해 늘어 났으며 원래의 예외 스택 추적을 숨기는 데 불쾌한 효과가 있습니다. 이런 식으로 잡힌 예외를 던지면 스택 추적의 상단이 throw 언급없이 레벨 DoSomething 또는 중첩 된 방법 호출이 실제로 예외를 일으켰습니다.

행운을 빕니다.

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