Google을 실행하기 전에 예외 처리에 관한 기사, 게시물 및 의견을 많이 읽었지만 이러한 특정 사항에 여전히 고착되어 있습니다.계층화 된 아키텍처에서 예외를 처리하는 방법은 무엇입니까?
아래 예제를 통해 다음 시나리오를 어떻게 다룰 수 있습니까?
- 예외가 DAL 계층에서 발생하고 더 많은 정보를 제공하고 더 잘 분류하기 위해 사용자 지정 예외로 래핑되는 경우. 어떻게 로그합니까?
DAL 계층에서 발생하는대로 기록하면 글로벌 처리기 (elmah 사용)에 다시 기록됩니다. 나는 그것을 전파 할 수는 있지만, ServiceLayer가 그 예외를 사용자를위한보다 사용자 친화적 인 메시지로 변환하거나 트랜잭션 목적으로 사용할 수 있다면 (롤백을 생각해 보라) 어떻게 될까? 나는 DAL 예외에서 수집 된 정보를 잃을 것이다. (어쨌든, 반드시 스택 추적은 아니다.) 내가 DAL 로그인 할 첫 번째 경우에, 그래서 예외가 실제로 무슨 일이 있었 -
// UI
public static GetUser(int userId)
{
// Should I do validation here or in service layer
try
{
IUserService s = new UserService(userId);
s.GetUser(userId);
}
catch(ServiceLayerException ex)
{
// ex.Message displayed to user
}
}
// Service layer
public User GetUser(int userId)
{
try
{
return repo.GetUser(userId);
}
catch(DALException ex)
{
// user-friendly message displayed to user
throw new ServiceLayerException("User does not exist");
}
}
// DAL
public User GetUser(int userId)
{
try
{
// Query for user, if fails throw DALException
return userId;
}
catch (SqlException ex)
{
throw new DALException("Could not retrieve user with userId " + userId.ToString());
}
}
특별히 DAL이나 그 레이어에 로깅을하는 것은 동일한 예외를 두 번 이상 기록 할 위험이 있습니다. 많은 다른 서비스에서 호출되는 매우 일반적인 DAL 메서드가 있고 어떤 경우에는 서비스 계층에서 예외를 처리 할 수 있고 다른 경우에는 그렇지 못하므로 예외가 전역 처리기로 전파되어 두 번 기록됩니다. – chobo
네, 그렇습니다. DAl에서 에러 데이터를 캡쳐하고 예외 데이터가 있지만 예외가없는 서비스 레이어로 돌아 가면 (DAL에서 처리 된 경우) 해당 라인과 그 아래로 전달되는 예외 사이에 장애가 발생할 수있는 위험이 있습니다 중간 문제로 인해 예외가 숨겨져 있습니다 (예 : 메모리 예외로 인해 처리 할 수없는 오류가 발생할 수 있음). 이것은 또한 elmah와 같은 일반적인 오류보고 시스템을 사용하는 대가이기도합니다. – Wolf5370
다운 스트림 레이어의 부적절한 오류 처리 가능성 때문에 인과 관계 예외가 손실 될 위험이 더 커야합니다. 또 다른 확실한 방법은 로깅 서비스를 사용하여 계층에서 호출하고 비즈니스 로직을 구축하여 중복 로그를 로그/relog 또는 drop 여부를 결정한 다음 전혀 걱정하지 않아도됩니다. – Wolf5370