2011-11-03 3 views
3

간단한 웹 클라이언트를 사용하여 웹 서비스에서 일부 XML을 가져오고 있습니다.이 간단한 시도, catch catch (WebException 잡기)에 있습니다. 다음과 같이; 내가 유효하지 않은 하나의 IP 주소를 변경하는 경우webexception 잡기 중 오류가 발생했습니다.

try 
     { 
      WebClient client = new WebClient(); 
      client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted); 
      client.DownloadStringAsync(new Uri("http://ip/services")); 
     } 
     catch (WebException e) 
     { 

      Debug.WriteLine(e.Message); 
     } 

아니, 내가 그것을 예외 및 출력 디버그 창에 메시지를 던질 것으로 예상하는의 것입니다. 하지만 그렇지 않습니다, 그것은 catch 블록이 실행되지 않는 것 같습니다. 아무 것도 나타나지 않고 디버그 창은 다음과 분리되어 있습니다.

A first chance exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.dll 
A first chance exception of type 'System.Net.WebException' occurred in System.Windows.dll 
A first chance exception of type 'System.Net.WebException' occurred in System.Windows.dll 

내 코드가 내게 보이는 것처럼 예외가 잡히지 않는 이유를 이해할 수 없습니까?

+0

일반적인 예외를 잡으려고 했습니까? 'catch (Exception ex)'와 비슷합니다. – NaveenBhat

+0

Exception을 사용하여 같은 결과를 얻습니다. 감사합니다 – Nathan

답변

5

오류 메시지에 대한 설명에서 던진 실제 예외는 "FileNotFoundException"유형이라고 가정합니다.

예외를 잡아 유형을 확인하려고 했습니까? 웹 예외가 내부 예외 일 수 있습니다.

 try 
     { 
      WebClient client = new WebClient(); 
      client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted); 
      client.DownloadStringAsync(new Uri("http://ip/services")); 
     } 
     catch (Exception ex) 
     { 

      Debug.WriteLine(ex.GetType().FullName); 
      Debug.WriteLine(ex.GetBaseException().ToString()); 
     } 

업데이트 : 실제로 방금 호출 한 내용은 비동기 메서드입니다.

나는 비동기 메서드로 스와핑하고 그로 인해 생성 된 오류를 확인하는 것이 좋습니다.

WebClient.DownloadString Method (Uri)

또한 예를 들어 웹 클라이언트를 사용하여 비동기 오류를 잡기를 통해 안내 페이지에서 찾고 혜택을 누릴 수 있습니다.

Async Exceptions

+0

여전히 동일한 경우에도 간단한 Debug.WriteLine ("테스트"); catch 블록에서 catch 블록이 실행되고 있지 않음을 나타내는 실행되지 않습니다. 감사합니다. – Nathan

+0

답변이 업데이트되었습니다. 비동기 메서드를 호출하는 것으로 나타났습니다. – fluent

+0

감사합니다. 나는 비동기적인 일을 할 때 예외를 다르게 잡아야한다는 것을 알지 못했다. 나는 당신이 (링크를 통해) 게시 한 메소드를 사용하지는 않았지만, 대신 효과가있는 DownloadStringCompleted에서 에러를 체크했다. 대답 해 주셔서 감사합니다! – Nathan

3

예외는 DownloadStringAsync에서 발생하지 않을 것입니다. 단순히 던지지는 않지만 DownloadString (비동기가 아닌)이 던져 버립니다. 이것이 버그인지 모르겠다. 나는 비동기 메소드가 ArgumentException과 별개로 예외를 던지지 않을 것이라고 생각했다. 그렇지 않다면 문서 states.

void DownloadStringCompletedEventHandler(object sender, DownloadStringCompletedEventArgs e) 
{ 
    if (e.Error != null) 
    { 
     Debug.WriteLine(e.Error); 
     return; 
    } 

당신은 거의 항상 안전하게 "첫 번째 기회"예외를 무시할 수는, 그이 프레임 워크 내에서 잡은 따라 처리됩니다

당신은 "캐치"를 DownloadStringCompletedEventHandler의 오류에있다. 이에 대한 자세한 정보는 this question을 참조하십시오.

관련 문제