2012-03-29 5 views
1

Google을 실행하기 전에 예외 처리에 관한 기사, 게시물 및 의견을 많이 읽었지만 이러한 특정 사항에 여전히 고착되어 있습니다.계층화 된 아키텍처에서 예외를 처리하는 방법은 무엇입니까?

아래 예제를 통해 다음 시나리오를 어떻게 다룰 수 있습니까?

  1. 예외가 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()); 
      } 

     } 

답변

1

개인적으로 나는 coalface에 로그인하는 것을 선호합니다. Bal (서비스 계층)은 오류를 전파하지 않거나 elmah가 기록하도록 허용하지 않으면 오류를 처리 할 수 ​​있습니다 (오류 페이지에 표시되고 예외를 추적하는 데 도움이되는 것은 나쁜 것이 아닙니다). 서비스 계층은 내부 예외로 DAL 오류를 전달하여 필요한 경우 전파 중에/후에 액세스 할 수 있습니다. 예외적으로 iteslf는 계층간에 필요에 따라 변경 될 수 있습니다. 사용자는 일반적으로 그러한 정보를 원하지 않으며 보통의 메시지를받습니다. 이벤트를 사용하여 예외 데이터를 수집하고 (특수 이벤트 arguements 사용) 부울 메서드 반환을 다시 전달할 수도 있습니다. 더 제어 가능하고 맞춤식으로 처리 할 수 ​​있습니다.이 경우 프로 그 게이트 여부를 결정할 수 있지만 "예상 된"예외에만 사용될 가능성이 있습니다.

+0

특별히 DAL이나 그 레이어에 로깅을하는 것은 동일한 예외를 두 번 이상 기록 할 위험이 있습니다. 많은 다른 서비스에서 호출되는 매우 일반적인 DAL 메서드가 있고 어떤 경우에는 서비스 계층에서 예외를 처리 할 수 ​​있고 다른 경우에는 그렇지 못하므로 예외가 전역 처리기로 전파되어 두 번 기록됩니다. – chobo

+0

네, 그렇습니다. DAl에서 에러 데이터를 캡쳐하고 예외 데이터가 있지만 예외가없는 서비스 레이어로 돌아 가면 (DAL에서 처리 된 경우) 해당 라인과 그 아래로 전달되는 예외 사이에 장애가 발생할 수있는 위험이 있습니다 중간 문제로 인해 예외가 숨겨져 있습니다 (예 : 메모리 예외로 인해 처리 할 수없는 오류가 발생할 수 있음). 이것은 또한 elmah와 같은 일반적인 오류보고 시스템을 사용하는 대가이기도합니다. – Wolf5370

+0

다운 스트림 레이어의 부적절한 오류 처리 가능성 때문에 인과 관계 예외가 손실 될 위험이 더 커야합니다. 또 다른 확실한 방법은 로깅 서비스를 사용하여 계층에서 호출하고 비즈니스 로직을 구축하여 중복 로그를 로그/relog 또는 drop 여부를 결정한 다음 전혀 걱정하지 않아도됩니다. – Wolf5370

관련 문제