2013-09-26 26 views
8

के भीतर एचटीपी क्लाइंट अपवादों को उचित रूप से संभालने की उम्मीद है कि मैं उम्मीद कर रहा था कि कोई मुझे किसी समस्या पर थोड़ा सा प्रबुद्ध कर सकता है जिसे मैं एटीएनसीसी/एचटीपी क्लाइंट के साथ अपवाद हैंडलिंग के संबंध में सामना कर रहा हूं। मैं वर्णन करने के लिए कुछ कोड लिखा है, और यह दोनों एक Windows Phone 8 डिवाइस और एमुलेटर पर excecuted किया जा रहा है:एसिंक/प्रतीक्षा

private async void SearchButton_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      HttpClient client = new HttpClient(); 
      System.Diagnostics.Debug.WriteLine("BEGIN FAULTY REQUEST:"); 
      string response = await client.GetStringAsync("http://www.ajshdgasjhdgajdhgasjhdgasjdhgasjdhgas.tk/"); 
      System.Diagnostics.Debug.WriteLine("SUCCESS:"); 
      System.Diagnostics.Debug.WriteLine(response); 
     } 
     catch (Exception exception) 
     { 
      System.Diagnostics.Debug.WriteLine("CAUGHT EXCEPTION:"); 
      System.Diagnostics.Debug.WriteLine(exception); 
     } 
    } 

बटन इस समारोह का आह्वान है कि दोहन, डिबगर कंसोल में निम्न उत्पादन, सबसे पैदा करता है दिलचस्प बोल्ड में लोगों को किया जा रहा है:

शुरू ख़राब अनुरोध:

प्रकार 'System.Net.WebException' की एक अपवाद System.Windows.ni.dll में हुई है और एक कामयाब पहले से संभाला नहीं गया था/मूल सीमा

प्रकार 'System.Net.WebException' की एक अपवाद System.Windows.ni.dll में हुई है और एक कामयाब/देशी सीमा

प्रकार का एक पहला मौका अपवाद 'सिस्टम से पहले संभाला नहीं गया था। Net.Http.HttpRequestException System.Net.Http.HttpRequestException 'mscorlib.ni.dll में हुई है और एक कामयाब/देशी सीमा पहले से संभाला नहीं गया था' mscorlib.ni.dll

प्रकार का एक अपवाद में हुई '

CAUGHT अपवाद: (और यहां यह HttpRequestException को प्रिंट करता है)

बेशक मुझे इस मामले में एक त्रुटि की उम्मीद है क्योंकि मैं जिस यूआरएल को कॉल कर रहा हूं वह बकवास है। जो मैं यहां समझ नहीं रहा हूं, यही कारण है कि डीबगर रिपोर्ट करता है कि अपवादों को संभाला नहीं जाता है, जब आउटपुट एक साथ रिपोर्ट करता है कि अपवाद पकड़ा जाता है। इसके अलावा, ऐप का UI पक्ष आउटपुट मुद्रित होने पर बहुत कम उत्तरदायी हो जाता है, यह दर्शाता है कि कुछ शायद अस्वस्थ है।

क्या यह एसिंक के साथ काम करते समय अपवादों को संभालने का तरीका नहीं है और इंतजार कर रहा है? मैं किसी भी इनपुट की सराहना करता हूं! धन्यवाद।

+2

जहां तक ​​जवाबदेही के रूप में आप एक यूआई घटना में लंबे प्रक्रियाओं नहीं भागना चाहिए। ये त्वरित और लंबी चल रही प्रक्रियाओं को एक और धागे में पूरा किया जाना चाहिए। 'BackgroundWorker' को आज़माएं http://msdn.microsoft.com/en-us/library/System.ComponentModel.BackgroundWorker.aspx – Harrison

उत्तर

6

यह डीबगर का एक आर्टिफैक्ट है। यह निर्धारित कर रहा है कि एक अपवाद "uncaught" है क्योंकि यह अभी तक पकड़ा नहीं गया है। इस मामले में यह व्यवहार की उम्मीद है।

आप अपवादों को सही तरीके से प्रबंधित कर रहे हैं।

+2

मैं कहूंगा कि इसे" uncaught "चिह्नित किया गया है क्योंकि यह उपयोगकर्ता कोड द्वारा पकड़ा नहीं गया था, लेकिन द्वारा टीपीएल – usr

+0

अपवाद को संभाला नहीं जाता है। यह छिपी हुई है (भले ही यह डीबग। राइटलाइन पर लॉग ऑन हो जो रिलीज़ मोड में दिखाई नहीं देगी)। रिलीज में बनाया गया है, अगर http कॉल विफल रहता है, तो आप नहीं जान पाएंगे कि क्यों (या यहां तक ​​कि यह असफल रहा)। – Stuart

+0

@ स्टुअर्ट: प्रश्न में पोस्ट कोड के लिए, अपवाद पकड़ा जाएगा। –

0

डीबगर आपको बता रहा है कि यह अपवाद पहला मौका है। जब आपकी प्रक्रिया से एक डीबगर जुड़ा होता है तो इसे फेंकने वाले प्रत्येक अपवाद के लिए अधिसूचित किया जाता है और फिर डीबगर को कॉन्फ़िगर करने के तरीके के आधार पर यह तय किया जाएगा कि यह इसके साथ क्या करना है। अधिक जानकारी के लिए आप What is first chance exception? से जा सकते हैं।

एक तरफ ध्यान दें, केवल विशिष्ट अपवादों को पकड़ें ताकि आप समझ सकें कि आप कौन से अपवादों की अपेक्षा कर रहे हैं और क्यों।

+0

धन्यवाद, मैं पढ़ा होगा! और मैं आपकी तरफ से सहमत हूं, मेरा वास्तविक परिदृश्य अलग है, मैंने अपनी समस्या को स्पष्ट करने के लिए इसे अभी लिखा है। –

22

आप HttpClient उपयोग कर रहे हैं के रूप में, उपयोग करने के लिए response.EnsureSuccessStatusCode();

अब HttpClient अपवाद होगा प्रतिसाद स्थिति को सफल कोड नहीं है जब प्रयास करें।

try 
{ 
    HttpResponseMessage response = await client.GetAsync("http://www.ajshdgasjhdgajdhgasjhdgasjdhgasjdhgas.tk/"); 
    response.EnsureSuccessStatusCode(); // Throw if not a success code. 

    // ... 
} 
catch (HttpRequestException e) 
{ 
    // Handle exception. 
} 

कोड के मूल स्रोत: http://www.asp.net/web-api/overview/advanced/calling-a-web-api-from-a-net-client

+3

यदि आप 'httpResponseMessage' टाइप करने के लिए 'प्रतिक्रिया' चाहते हैं तो आपको' client.GetAringync' 'क्लाइंट.GetStringAsync' का उपयोग करना होगा। – kaolick