2014-10-07 6 views
0

저는 잠시 동안 내 머리를 긁어 왔습니다. 나는이 예외가 던져지고있는 어떤 단서도 가지고 있지 않다. 도대체 나는이 예외를 잡기로되어 있나? System.Net.WebException입니다. 나는 단지 Task와 Async/Await을 얻지 못하고있는 것 같다. 다른 스레드를 만드는 중이라는 것을 이해합니다.이 스레드는 모두 훌륭하지만 모든 예외를 처리 할 수 ​​있습니까?작업에서 던져진 예외를 캐치 할 수 없습니다.

다음
public async void sendRequest(string database, string table, string where, bool isPost, int deviceType) 
{ 
    string urlQuery = Constants.URL_QUERY + database + "/" + table + "?" + where; 

    Debug.WriteLine("URL Query: " + urlQuery); 

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlQuery); 
    request.Method = isPost ? "POST" : "GET"; 
    request.ContentType = "application/json"; 

    try 
    { 
     Debug.WriteLine("getting response"); 
     WebResponse response = await makeAsyncRequest(request); 
     Debug.WriteLine("response obtained"); 
     finishRequest(response); 
    } 
    catch (WebException e) 
    { 
     Debug.WriteLine("WebException caught"); 
    } 
} 

private async static Task<WebResponse> makeAsyncRequest(HttpWebRequest req) 
{ 
    Task<WebResponse> task = Task.Factory.FromAsync<WebResponse>(req.BeginGetResponse, req.EndGetResponse, null); 

    await task.ContinueWith(t => 
    { 
     if (t.IsFaulted) 
     { 
      Debug.WriteLine("It's faulted."); 
      t.Exception.Handle((x) => 
      { 
       if (x is WebException) 
       { 
        Debug.WriteLine("It's a web exception"); 
        return true; 
       } 
       Debug.WriteLine("Exception?: " + x); 
       return false; 
      }); 
     } 
    }); 
    Debug.WriteLine("returning task"); 
    return task.Result; 
} 

private static void finishRequest(WebResponse response) 
{ 
    Debug.WriteLine("finishRequest called"); 
} 

내가 내 출력 창에 표시되는 내용입니다 : 여기

The remote server returned an error: (403) Forbidden.

코드입니다

2014-10-07 14:05:05.104 FormsTemplateiOS[1568:53280] getting response 
[0:] getting response 
Thread started: #3 
Thread started: <Thread Pool> #4 
Thread started: <Thread Pool> #5 
Thread started: <Thread Pool> #6 
Thread started: <Thread Pool> #7 
Thread started: #8 
[0:] 
2014-10-07 14:05:05.681 FormsTemplateiOS[1568:53326] It's faulted. 
[0:] It's faulted. 
[0:] 
2014-10-07 14:05:05.804 FormsTemplateiOS[1568:53326] It's a web exception 
[0:] It's a web exception 
Unhandled Exception: 

System.Net.WebException: The remote server returned an error: (403) Forbidden. 

Unhandled Exception: 
System.Net.WebException: The remote server returned an error: (403) Forbidden. 
    at System.Net.HttpWebRequest.CheckFinalStatus (System.Net.WebAsyncResult result) [0x0033b] in ///Library/Frameworks/Xamarin.iOS.framework/Versions/8.0.0.63/src/mono/mcs/class/System/System.Net/HttpWebRequest.cs:1718 
    at System.Net.HttpWebRequest.SetResponseData (System.Net.WebConnectionData data) [0x00165] in ///Library/Frameworks/Xamarin.iOS.framework/Versions/8.0.0.63/src/mono/mcs/class/System/System.Net/HttpWebRequest.cs:1485 
The program 'Mono' has exited with code 0 (0x0). 
Debugging session ended. 

편집 : 스티븐 클리어 리 당 makeAsyncRequest(HttpWebRequest) 업데이트

암시. 나는 여전히 같은 문제를 겪고있다.

private async static Task<WebResponse> makeAsyncRequest(HttpWebRequest req) 
{ 
    Task<WebResponse> task = Task.Factory.FromAsync<WebResponse>(req.BeginGetResponse, req.EndGetResponse, null); 
    try 
    { 
     return await task; 
    } 
    catch (WebException e) 
    { 
     Debug.WriteLine("It's a WebException"); 
    } 
    catch (Exception e) 
    { 
     Debug.WriteLine("Other Exception"); 
    } 
    return null; 
} 

출력 창 :

2014-10-07 14:32:08.385 FormsTemplateiOS[1588:57008] getting response 
[0:] getting response 
Thread started: #3 
Thread started: <Thread Pool> #4 
Thread started: <Thread Pool> #5 
Thread started: <Thread Pool> #6 
Thread started: <Thread Pool> #7 
Thread started: #8 
Unhandled Exception: 

System.Net.WebException: The remote server returned an error: (403) Forbidden. 

Unhandled Exception: 
System.Net.WebException: The remote server returned an error: (403) Forbidden. 
    at System.Net.HttpWebRequest.CheckFinalStatus (System.Net.WebAsyncResult result) [0x0033b] in ///Library/Frameworks/Xamarin.iOS.framework/Versions/8.0.0.63/src/mono/mcs/class/System/System.Net/HttpWebRequest.cs:1718 
    at System.Net.HttpWebRequest.SetResponseData (System.Net.WebConnectionData data) [0x00165] in ///Library/Frameworks/Xamarin.iOS.framework/Versions/8.0.0.63/src/mono/mcs/class/System/System.Net/HttpWebRequest.cs:1485 
The program 'Mono' has exited with code 0 (0x0). 
Debugging session ended. 
+0

_. 나는이 예외가 던져지고 있다는 것을 알지 못한다. StackTrace를 보려고 했는가? –

+0

질문에 출력 추가. –

+0

[예외가 발생하면 중단] (http://msdn.microsoft.com/en-us/library/d14azbfh.aspx)를 사용하십시오. 디버거가 예외가 발생하는 곳에서 바로 멈 춥니 다. 다른 옵션은 StackTrace를 검사합니다. –

답변

4

는 내가 실제로 큰 인 다른 스레드를 생성하고 모든

없음있어 이해합니다. 내 async intro을 읽을 수도 있습니다. 또한

:

  • async void.
  • ContinueWith 대신 await을 사용하십시오.

async best practices 문서가 도움이 될 수도 있습니다.

private async static Task<WebResponse> MakeRequestAsync(HttpWebRequest req) 
{ 
    Task<WebResponse> task = Task.Factory.FromAsync<WebResponse>(req.BeginGetResponse, req.EndGetResponse, null); 
    try 
    { 
    return await task; 
    } 
    catch (WebException ex) 
    { 
    Debug.WriteLine("It's a web exception"); 
    } 
    catch (Exception ex) 
    { 
    Debug.WriteLine("It's not a web exception."); 
    } 
} 

최종 참고로, HttpWebRequest 대신 HttpClient을 사용하는 것이 좋습니다. HttpClientasync 사용을 위해 설계되었습니다.

+0

작업이 별도의 스레드에 없다면 System.Threading의 일부분 인 이유는 무엇입니까? –

+3

그것은 역사적인 이유로입니다. 'Task'는 원래 Task Parallel Library의 일부로 도입되었는데, 주로 스레드에서 실행되는 작업을 나타내는 데 사용되었습니다. 임의의 "비동기 작업"으로 사용하기 위해 용도 변경되었습니다. –

+0

요청 헤더와 메소드를 POST 또는 GET으로 설정할 수 있어야합니다. 이게 HttpClient로 할 수 있습니까? 속성과 메서드를 스크롤하면이 작업을 수행 할 수있는 내용이 표시되지 않습니다. –

관련 문제