আমি কীভাবে 404 ধরতে পারি?


95

আমার কাছে নিম্নলিখিত কোড রয়েছে:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "HEAD";
request.Credentials = MyCredentialCache;

try
{
    request.GetResponse();
}
catch
{
}

আমি কীভাবে একটি নির্দিষ্ট 404 ত্রুটি ধরতে পারি? ওয়েবএক্সেপশনস্ট্যাটাস.প্রোটোকল ইরার কেবল একটি ত্রুটি ঘটেছে তা সনাক্ত করতে পারে তবে ত্রুটির সঠিক কোড দেয় না।

উদাহরণ স্বরূপ:

catch (WebException ex)
{
    if (ex.Status != WebExceptionStatus.ProtocolError)
    {
        throw ex;
    }
}

কেবলমাত্র যথেষ্ট কার্যকর নয় ... প্রোটোকল ব্যতিক্রম 401, 503, 403, সত্যিই কিছু হতে পারে।


13
এনএনএনইউইউইউইউওও! ধরবেন না System.Exception, এবং আপনার হ্যান্ডলারের ব্যতিক্রম পাঠ্যের উপর নির্ভর করবেন না !
অ্যারোনআউট

4
জন স্যান্ডার্সের উত্তরটি সবচেয়ে সম্পূর্ণ ছিল। আমি মনে করি লোকেরা তাকে তুচ্ছ করে ফেলেছে।
অ্যারোনআউট

4
ব্যবহার করবেন না throw ex, আপনি খালি কল স্ট্যাক সহ একটি নতুন ব্যতিক্রম উত্পন্ন করবেন । শুধু ব্যবহার throw
krbnr

4
আমি নিজেকে সর্বদা হতাশারূপে দেখেছি। আপনি যদি একটি সুগঠিত প্রতিক্রিয়া পান তবে একটি ব্যতিক্রম ছুঁড়ে ফেলা উচিত নয় এবং একটি প্রোটোকল ত্রুটি বার্তাটি অবশ্যই সুসংহত হয়। শ্রেণীর ব্যবহারকারীকে ফলাফলগুলি ব্যাখ্যা করতে এবং সেই অনুযায়ী কাজ করার অনুমতি দেওয়া উচিত।
জেরেমি হলোভ্যাকস

@ জেরেমি হোলোভাকস ব্যতিক্রমগুলি আর নতুন পোস্ট ক্লায়েন্টগুলিতে 404 এর মতো জিনিসগুলির জন্য আর ছুঁড়ে দেওয়া হচ্ছে না। "নিয়ন্ত্রণ প্রবাহের জন্য ব্যতিক্রমগুলি ব্যবহার করবেন না" যে দলটি তৈরি করেছিল তাদের টিকে থাকতে পারে বলে মনে হয় নাWebRequest
ম্যাট কোকাজ

উত্তর:


115

HttpStatusCode Enumerationবিশেষভাবে ব্যবহার করুনHttpStatusCode.NotFound

কিছুটা এইরকম:

HttpWebResponse errorResponse = we.Response as HttpWebResponse;
if (errorResponse.StatusCode == HttpStatusCode.NotFound) {
  //
}

কই
weWebException


আমার নিজের অনুসন্ধানের তালিকাটি তৈরি না করে আমি কীভাবে কোনওভাবে অবজেক্টগুলি থেকে আউট পেতে পারি? আমি এর মতো কিছু পেতে চাই: int httpresponsecode = HTTPStatusCode.ToInt () বা অনুরূপ যাতে আমি 404 পাই
বার্গগ্রিনডি কে

4
@ বার্গগ্রিনডি কে আপনার কেবলমাত্র httpresonsecode = (int) এইচটিপিস্ট্যাটাসকোড.নোটফাউন্ড
ট্রেভ

8
-1 আমার প্রাচীন downvote আংশিক ব্যাখ্যা: কোড NullReferenceException ছোঁড়ার তাহলে কিছু কারণে, we.Responseনয় HttpWebResponse। কোড অনুমান করা এটা সবসময় যে ধরনের আছে করবে শুভেচ্ছা ফেলেন, তাহলে এটি কেবল নিক্ষেপ করা উচিত: HttpWebResponse errorResponse = (HttpWebResponse)we.Response;। এটি InvalidCastExceptionএকটি রহস্যজনক পরিবর্তে অসম্ভব ঘটলে, একটি স্পষ্ট নিক্ষেপ করবে NullReferenceException
জন স্যান্ডার্স

আমি An object reference is required for the non-static field, method, or property 'WebException.Response'এই কোড ব্যবহার করছি ।
জেমি

122
try
{
    var request = WebRequest.Create(uri);
    using (var response = request.GetResponse())
    {
        using (var responseStream = response.GetResponseStream())
        {
            // Process the stream
        }
    }
}
catch (WebException ex)
{
    if (ex.Status == WebExceptionStatus.ProtocolError &&
        ex.Response != null)
    {
        var resp = (HttpWebResponse) ex.Response;
        if (resp.StatusCode == HttpStatusCode.NotFound)
        {
            // Do something
        }
        else
        {
            // Do something else
        }
    }
    else
    {
        // Do something else
    }
}

10
LOL @ আইডিজিপোজেবল পুলিশ হচ্ছেন এবং ব্যবহারের ব্লকে প্রতিক্রিয়াটি মোড় না দেওয়ার জন্য প্রত্যেককে একটি -1 প্রদান করুন।
ধনী

4
এটি একটি কঠিন কাজ, তবে কাউকে এটি করতে হবে। ওহ, আমি প্রায় এই উত্তরটি যোগ করিনি, যেহেতু মনে হতে পারে যে আমি আমার শীর্ষস্থানীয় উত্তরটি তৈরি করতে অন্য সবাইকে ডিংগ করছি।
জন স্যান্ডার্স

4
আমি প্রকৃতপক্ষে upvated, কিন্তু আমি কেবল একটি জিনিস লক্ষ্য করেছি: throwআপনার শেষে সম্ভবত একটি (পুনর্বিবেচনা) হওয়া উচিত catch, অন্যথায় এটি নিঃশব্দে অন্য কোনও ধরণের খাওয়া হবে WebException
অ্যারোনআউট

@ জন সান্ডার্স: আপনার অনুরোধটিও কেন ব্যবহার করছেন না?
জোয়েল ইথারটন

4
@ জোয়েল: WebRequestবাস্তবায়ন করে না IDisposable
জন স্যান্ডার্স

25

সি # 6 এ আপনি ব্যতিক্রম ফিল্টার ব্যবহার করতে পারেন ।

try
{
    var request = WebRequest.Create(uri);
    using (var response = request.GetResponse())
    using (var responseStream = response.GetResponseStream())
    {
        // Process the stream
    }
}
catch(WebException ex) when ((ex.Response as HttpWebResponse)?.StatusCode == HttpStatusCode.NotFound)
{
    // handle 404 exceptions
}
catch (WebException ex)
{
    // handle other web exceptions
}

একটি দুর্দান্ত বৈশিষ্ট্য যা আমি অবহেলিত হয়েছি! অন্যকে সাধারণ ব্যতিক্রম হ্যান্ডলারের কাছে দিয়ে যাওয়ার সময় আমি কেবল 401 ধরার জন্য পদ্ধতিগুলি সন্ধান করতে থাকি। এভাবেই যেতে হবে!
লিওনেট চেন

বকেয়া, এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
লুকাস 925

12

আমি এটি পরীক্ষা করিনি, তবে এটি কাজ করা উচিত

try
{
    // TODO: Make request.
}
catch (WebException ex)
{
    if (ex.Status == WebExceptionStatus.ProtocolError) {
        HttpWebResponse resp = ex.Response as HttpWebResponse;
        if (resp != null && resp.StatusCode == HttpStatusCode.NotFound)
        {
            // TODO: Handle 404 error.
        }
        else
            throw;
    }
    else
        throw;
}

@ জন স্যান্ডার্স - আমি ওপির কোডটি মানিয়ে নিচ্ছিলাম, এটি অপ্টিমাইজ করছি না।
মিফ দ্য ফক্স

@ জন - এবং সম্ভবত আমি ওকে catchব্লকটি অনুলিপি / পেস্ট করার আশা করছিলাম , কারণ ওপি হিসাবে চেষ্টা করার মতো আমার কাছে একই কোড ছিল। তখনকার ওপির কোডের কারণে আপনার এই প্রশ্নটি পুরোপুরি ডাকা উচিত।
মিফ দফক্স

4
@ জন আমরা এখানে ভুলে যাচ্ছি নমুনা কোড। এটি ক্ষেত্রে এটি 404 এ যাওয়ার অন্য কোনও উপায়, কীভাবে getResponse ব্যবহার করবেন না। -1 দেখতে কিছুটা কঠোর মনে হচ্ছে। প্রশ্নের উত্তর দেওয়ার জন্য মিফকে +1 করুন।
ডেভিড বাসরব

@ জন আমার মনে হয় আপনার পক্ষে এটি একটি মন্তব্যে উল্লেখ করা ভাল। প্রদত্ত কোডটি সমস্যার সমাধান না করলে আমি ভোট দেওয়ার বিষয়টি যেভাবে দেখছি তা হ'ল। ডাউন ভোট অপসারণ করার জন্য আপনাকে ধন্যবাদ।
ডেভিড বাসরব

@ জন - ভাল, আমি ক্যাচ ছাড়া সব কিছু থেকে মুক্তি পেয়েছি, এখন খুশি?
মিফফক্স

4

আমার মনে হয় আপনি যদি ধরেন ওয়েবএক্সেপশন ধরেন তবে সেখানে কিছু তথ্য রয়েছে যা আপনি এটি নির্ধারণ করতে ব্যবহার করতে পারেন এটি 404 কিনা। এই মুহুর্তে আমি কেবল এটিই জানি ... আমি অন্য কারও সম্পর্কে জানতে আগ্রহী হব ...

catch(WebException e) {
    if(e.Status == WebExceptionStatus.ProtocolError) {
        var statusCode = (HttpWebResponse)e.Response).StatusCode);
        var description = (HttpWebResponse)e.Response).StatusDescription);
    }
}

2

এই স্নিপিট পরীক্ষা করে দেখুন। GetResponse একটি ওয়েবরেক্সটেক্সপশন নিক্ষেপ করবে। এটি ধরুন এবং প্রতিক্রিয়া থেকে আপনি স্থিতি কোডটি পেতে পারেন।

try {
   // Create a web request for an invalid site. Substitute the "invalid site" strong in the Create call with a invalid name.
     HttpWebRequest myHttpWebRequest = (HttpWebRequest) WebRequest.Create("invalid site");

    // Get the associated response for the above request.
     HttpWebResponse myHttpWebResponse = (HttpWebResponse) myHttpWebRequest.GetResponse();
    myHttpWebResponse.Close();
}
catch(WebException e) {
    Console.WriteLine("This program is expected to throw WebException on successful run."+
                        "\n\nException Message :" + e.Message);
    if(e.Status == WebExceptionStatus.ProtocolError) {
        Console.WriteLine("Status Code : {0}", ((HttpWebResponse)e.Response).StatusCode);
        Console.WriteLine("Status Description : {0}", ((HttpWebResponse)e.Response).StatusDescription);
    }
}
catch(Exception e) {
    Console.WriteLine(e.Message);
}

এটি http://msdn.microsoft.com/en-us/library/system.net.webexception.status.aspx থেকে এসেছে


2

যথাযথ ব্যতিক্রম প্রকারটি ধর WebException:

try
{
    var request = (HttpWebRequest) WebRequest.Create(String.Format("http://www.gravatar.com/avatar/{0}?d=404", hashe));

    using(var response = (HttpWebResponse)request.GetResponse())
        Response.Write("has avatar");
}
catch(WebException e) 
{
  if(e.Response.StatusCode == 404) 
    Response.Write("No avatar");
}

@ জন সান্ডার্স আমি সেখানে আপনার বিষয়ে বিতর্ক করি না, তবে এটিই প্রশ্ন ছিল না, তিনি ৪০৪ ক্যাপচার করার সবচেয়ে ভাল উপায়টি জিজ্ঞাসা করেছিলেন his তার কোডটিতে আমার পরিবর্তনগুলি প্রশ্নের উত্তরটি সীমাবদ্ধ ছিল, পরিবর্তনের মতো সহজ এবং স্পষ্ট করে তুলতে সম্ভব.
নিক Craver

@ জন স্যান্ডার্স: স্থির, আমি মনে করি "যদি এটি সবচেয়ে দক্ষ হয়" তবে এটি প্রশ্নের ক্ষেত্রে প্রযোজ্য।
নিক Craver

শুধু অ্যাক্সেস পাওয়ার আগে e.Responseযেমন কাস্ট HttpWebResponseকরতে হয়েছিল StatusCode
লঙ্কাইমার্ট

2

প্রতিক্রিয়ার স্থিতি সম্পর্কে এমএসডিএন দেখুন :

...
catch(WebException e) {
  Console.WriteLine("The following error occured : {0}",e.Status);  
}
...

4
@ জন স্যান্ডার্স - এমএসডিএন-তে (যেখানে আমি এই নমুনাটি অনুলিপি করেছি ...) দিয়ে দেওয়ার জন্য আমি বেশি খুশি হব। এই কোডের উদ্দেশ্যটি হ'ল স্থিতি কোডের ব্যবহার দেখানো, যতটা সম্ভব দক্ষ না হয়।
ভয়ঙ্কর

4
@John বিযয়ক - আমি অংশ মাত্র আমি দেখাতে চেয়েছিলেন শুধুমাত্র আপনার জন্য :-) বাম
Dror

2

VB.NET জনগণ এটি ব্রাউজ করছে, আমি বিশ্বাস করি এটি কেবলমাত্র 404 হলেই আমরা ব্যতিক্রমটি ধরতে পারি।

Try
    httpWebrequest.GetResponse()
Catch we As WebException When we.Response IsNot Nothing _
                              AndAlso TypeOf we.Response Is HttpWebResponse _
                              AndAlso (DirectCast(we.Response, HttpWebResponse).StatusCode = HttpStatusCode.NotFound)

    ' ...

End Try

1

যখন ওয়েবআরকুয়েস্ট ক্লাস ব্যবহার করে সার্ভারে পোস্ট বা জিইটি ডেটা হয় তখন ব্যতিক্রমের ধরণ হবে ওয়েবএক্সেপশন। ফাইলের ব্যতিক্রম পাওয়া যায় নি নীচে কোডটি

        //Create a web request with the specified URL
            string path = @"http://localhost/test.xml1";
            WebRequest myWebRequest = WebRequest.Create(path);

       //Senda a web request and wait for response.
                try
                {
                    WebResponse objwebResponse = myWebRequest.GetResponse();
                    Stream stream= objwebResponse.GetResponseStream();

                }
                catch (WebException ex) {
                    if (((HttpWebResponse)(ex.Response)).StatusCode == HttpStatusCode.NotFound) {
                        throw new FileNotFoundException(ex.Message);
                    }

                }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.