2011-03-21 7 views
5

외부 웹 서비스를 호출하는 프로그램이 있는데 예를 들어 사용자에게 친숙한 대화 상자를 표시하려고합니다. 서버는 사람이 다음 코드WCF 웹 서비스 호출 - 어떤 예외를 catch합니까?

try { 
    client.MyWebService() 
} 
catch(? ex) 
{ 
    // display friendly dialog explaining what went wrong 
} 

어떤 예외 (들) 내가 코드에 물음표의 장소에 배치해야 가정 등의 케이블을 절단, 다운? 모든 것이 원활하게 작동하고 외부 부분을 제어 할 수없는 상황을 실제로 테스트하는 것은 어렵습니다. 그래서 약간의 통찰력은 인정 될 것입니다.

감사합니다.

+0

특정 시나리오를 시도하려면 ... 그냥 시도해보고 어떻게됩니까? 부분적으로 대답은 알고있는 것 이외의 세부 사항이 누설되지 않는 것이 얼마나 중요한지에 달려 있습니다. 즉, "Oops 무언가 잘못되었습니다"+ ex.Message –

+0

을 표시해도 괜찮습니까? 보안상의 관점에서 " 죄송합니다 ... "라는 메시지를 통해 좀 더 구체적인 것을 선호합니다. – Eyvind

+3

"두 명의 숙녀가 집안일을하고 집에있는 두 명의 근로자 중 더 키가 큰 Jim이 실수로 접속 상자를 통해 삽을 집어 넣었습니다. 통신 기술자가 전화를 받았지만 다른 두 가지 일이 먼저있었습니다. 플러스 플러스 그가 그의 밴에서 가지고있는 미트볼 서브를 먹고 싶다면, 이것은 14:12 "에 의해 해결 될 것입니다 - 그것에 대한 특별한 예외가 있는지 확실하지 않습니다 ... p –

답변

5

먼저 할 일은 당신이이처럼 연결할 수있는 프록시,에 .Faulted 이벤트를 활용이다 연결 또는 백업 서버로 이동, UI 비활성화, 오류 로깅 또는 메시지 표시 등의 작업을 수행 할 수 있습니다.

각 호출을 try-catch로 랩핑하는 것은 여전히 ​​좋은 습관이지만, .Faulted 이벤트를 사용하면 대부분의 채널 문제를 훨씬 빨리 처리 할 수 ​​있습니다.

예외 자체는 귀하가 제공 한 세부 정보로 클라이언트에 전달되는 FaultException을 던질 수있게 할 수 있습니다. this blog posting에서 사용 예를 참조하십시오.

채널 자체가 실패하면 FaultException이 발생하지 않습니다 (FaultException은 서버가 자체 내부 결함을 클라이언트에 전달하는 방법 임).

채널 결함의 경우 CommunicationException 또는 TimeoutException이 표시 될 수 있습니다.

마지막으로 예외 처리 WCF 프록시 생성을 위해 Codeplex에서 this project을 살펴보십시오. 오류를 넘겨주는 좀 더 유연한 방법을 제공 할 수 있습니다.

1

가능한 한 많은 세부 사항을 제공하는 것이 실제로 고객의 임무는 아닙니다. 클라이언트 측에서 제공해야하는 최대 금액은 귀하가 예외적으로 환급 한 금액만큼입니다. 당신의 client_Faulted 이벤트 처리기에서

((ICommunicationObject)client).Faulted += new EventHandler(client_Faulted); 

그런 다음 다시 시도 할 수 있습니다 :

var userName = "bob"; 
try 
{  
    client.MyWebService(userName); 
} 
catch(Exception ex) 
{ 
    //Maybe we know WellKnownExceptions and can provide Foo advice: 
    if (ex is WellKnownException) 
    { 
     Console.WriteLine("WellKnownException encountered, do Foo to fix Bar."); 
    } 
    //otherwise, this is the best you can do: 
    Console.WriteLine(string.Format(
     "MyWebService call failed for {0}. Details: {1}", userName, ex)); 
} 
+3

WellKnownException을 던질 수 있다는 것을 안다면, 별도의'catch (WellKnownException wkex)'블록을 만들어야한다. –

+0

@CLaw : 스타일의 문제입니다. 예외 유형에 따라이 스타일의 if/then/else 논리를 더 간결하게 처리 할 수 ​​있습니다. 내 예제에서는 실제로이를 보여주지 않습니다. –