Resharper가 왜 '단일'던지기 '진술을 가진 Catch Clause'라고 말하는 이유는 무엇입니까?
-
06-07-2019 - |
문제
나는 예외를 던지는 것이 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
또는 중첩 된 방법 호출이 실제로 예외를 일으켰습니다.
행운을 빕니다.