2014-10-23 1 views
1

나는 try catch 내에서 래핑되도록 메서드 호출을 전달할 수 있다고 생각하는 다음 메서드를 작성했습니다. 내 응용 프로그램 전체에 걸쳐 동일한 try/catch 보일러 플레이트 코딩을하지 않으려 고합니다. 나는 이미 20 번의 전화를 받았고, 우리가 끝내면 수백 건의 전화가 걸릴 것입니다. 내가 예상대로이 작동하지 않는 처음에는 몰랐어요재사용 가능한 시도/캐치 블록

var results = CallRepository<VisitLogDTO>(visitLogRepository.AddVisit(visitLogDTO)); 

: 같은

protected T CallRepository<T>(T repositoryMethod) 
{ 
    try 
    { 
     return repositoryMethod; 
    } 
    catch (Exception ex) 
    { 
     logger.Error(ex); 
     throw new DatabaseException(); 
    } 
} 

호출 방법은 같습니다. 무슨 일이 일어나고 결과는 try/catch하지만 메서드 호출에 래핑되고있다. visitLogRepository에서 데이터베이스 오류 또는 오류가 발생하면 새 DatabaseExeception이 아니라 원래 오류가 발생합니다.

도움을 주시면 감사하겠습니다. 좋아

protected T CallRepository<T>(Func<T> repositoryMethod) 
{ 
    try 
    { 
     return repositoryMethod(); 
    } 
    catch (Exception ex) 
    { 
     logger.Error(ex); 
     throw; 
    } 
} 

및 사용 :

+2

을 당신은 메소드를 호출하지 않습니다. 'visitLogRepository.AddVisit (visitLogDTO)'의 결과를 전달합니다. 원하는 것은 CallRepository가 Func <> 매개 변수를 사용한다는 것입니다. – WeSt

+0

여기에 아주 좋은 정보가 있습니다. 현재는 문제가 해결되어 도움을 주셔서 감사 드리며 도움이 얼마나 빨리 도착했는지 놀랐습니다. 나는 DI 차단을 살펴보고 사용할 수 있는지 알아볼 것입니다. 그러나 지금은 Func 에 대한 WeSt & Eren Ersönmez 조언을 사용하고 있습니다. 나는 성공하기 전에 Func <>를 사용해 보았습니다. 나는 모든 차이를 만드는 람다 콜을 놓치고 있었다. – CubeRoot

답변

5

당신은 Func<T>하지 T을 통과해야

var results = CallRepository(() => visitLogRepository.AddVisit(visitLogDTO)); 
+0

+1. DI 프레임 워크의 로깅/인터셉터 기능을 사용하는 것이 좋을 것입니다. –

+0

Func 으로 변환 중입니다. 현재 불만족스러운 반환 유형이 있으므로 현재 오류가 발생합니다. 나는 계속 놀거야. – CubeRoot

+0

종속성 삽입에 Microsoft Unity를 사용하고 있습니다. 나는 로깅/인터 셉션에 익숙하지 않아 데이터 레이어 오류를 잡아 내 로그에 기록한 다음 친숙한 오류를 다시 발생시켜 MVC 계층을 다시 잡아 사용자를 친숙한 오류 페이지로 리디렉션합니다. Unity와는 다른, 제 3 자 NuGet 패키지를 추가 할 수 없습니다. 우리가 일하는 매우 엄격한 보안 태세를 갖고 있기 때문입니다. 그것이 Unity보다 더 관심이 있다면. – CubeRoot

0

을 잘 모르겠어요하지만이 AddVisit 방법은 외부에서 호출 것 같다 당신의 CallRepository 방법. 메서드 매개 변수로 작업 대리자를 사용하고 메서드에서 해당 대리자를 호출하여 try catch 내에서 호출이 완료되도록하십시오. 는 그 다음 전화를 람다 표현식을 사용

private handleException(Action myAction) 
{ 
    try 
    { 
     myAction(); 
    } 
    catch[...] 
} 

전화 :

handleException(() => { int result = FunctionThatThrowsException(); }) 

최저 LUMO

+0

반환 유형을 허용 할 예정입니까? 대부분의 메소드 호출은 데이터를 반환합니다. – CubeRoot

관련 문제