로컬 캐치가 안티 패턴이라고 생각하지 않습니다. 실제로 올바르게 기억하면 실제로 Java로 적용됩니다!
오류 처리를 구현할 때 가장 중요한 것은 전체 전략입니다. 서비스 경계에서 모든 예외를 포착하는 필터를 원할 수도 있고 수동으로 예외를 가로 채기를 원할 수도 있습니다. 팀 전체의 코딩 표준에 해당하는 전체 전략이있는 한 둘 다 괜찮습니다.
개인적으로 나는 다음 중 하나를 수행 할 수있을 때 함수 내부에서 오류를 포착하고 싶습니다.
- 상황에 맞는 정보 추가 (예 : 객체 상태 또는 진행 상황)
- 예외를 안전하게 처리하십시오 (예 : TryX 메소드)
- 시스템이 서비스 경계를 넘어 외부 라이브러리 또는 API를 호출 중입니다.
- 다른 유형의 예외를 포착하고 다시 던져야합니다 (아마도 원본을 내부 예외로 사용함)
- 일부 저가 백그라운드 기능의 일부로 예외가 발생했습니다.
이 경우 중 하나가 아닌 경우 로컬 try / catch를 추가하지 않습니다. 그렇다면 시나리오에 따라 예외 (예 : false를 반환하는 TryX 메서드)를 처리하거나 다시 던질 수 있으므로 전역 전략에 의해 예외가 처리됩니다.
예를 들면 다음과 같습니다.
public bool TryConnectToDatabase()
{
try
{
this.ConnectToDatabase(_databaseType); // this method will throw if it fails to connect
return true;
}
catch(Exception ex)
{
this.Logger.Error(ex, "There was an error connecting to the database, the databaseType was {0}", _databaseType);
return false;
}
}
또는 다시 던지는 예 :
public IDbConnection ConnectToDatabase()
{
try
{
// connect to the database and return the connection, will throw if the connection cannot be made
}
catch(Exception ex)
{
this.Logger.Error(ex, "There was an error connecting to the database, the databaseType was {0}", _databaseType);
throw;
}
}
그런 다음 스택 상단의 오류를 포착하고 사용자에게 멋진 사용자 친화적 인 메시지를 제공합니다.
어떤 방법을 사용하든 항상이 시나리오에 대한 단위 테스트를 작성하는 것이 좋습니다. 따라서 기능이 변경되지 않고 나중에 프로젝트 흐름을 방해하지 않도록 할 수 있습니다.
현재 어떤 언어로 작업하고 있는지 언급하지 않았지만 .NET 개발자이며 언급하지 않는 것이 너무 많습니다.
쓰지 마세요:
catch(Exception ex)
{
throw ex;
}
사용하다:
catch(Exception ex)
{
throw;
}
전자는 스택 추적을 재설정하고 최상위 레벨 캐치를 전혀 쓸모 없게 만듭니다!
TLDR
로컬로 캐치는 것은 반 패턴이 아니며 종종 디자인의 일부일 수 있으며 오류에 컨텍스트를 추가하는 데 도움이 될 수 있습니다.