Saya memiliki kode berikut:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "HEAD";
request.Credentials = MyCredentialCache;
try
{
request.GetResponse();
}
catch
{
}
Bagaimana saya bisa menangkap kesalahan 404 tertentu? WebExceptionStatus.ProtocolError hanya dapat mendeteksi bahwa kesalahan terjadi, tetapi tidak memberikan kode kesalahan yang tepat.
Sebagai contoh:
catch (WebException ex)
{
if (ex.Status != WebExceptionStatus.ProtocolError)
{
throw ex;
}
}
Tidak cukup berguna ... pengecualian protokol bisa jadi 401, 503, 403, apa saja.
System.Exception
, dan jangan bergantung pada teks pengecualian di handler Anda!throw ex
, Anda akan membuat pengecualian baru dengan tumpukan panggilan kosong. Gunakan sajathrow
.WebRequest
Jawaban:
Gunakan
HttpStatusCode Enumeration
, secara khususHttpStatusCode.NotFound
Sesuatu seperti:
HttpWebResponse errorResponse = we.Response as HttpWebResponse; if (errorResponse.StatusCode == HttpStatusCode.NotFound) { // }
Dimana
we
aWebException
.sumber
we.Response
tidakHttpWebResponse
. Jika kode ingin menganggap bahwa ia akan selalu memiliki jenis itu, maka harus hanya melemparkan:HttpWebResponse errorResponse = (HttpWebResponse)we.Response;
. Ini akan melemparkan eksplisitInvalidCastException
jika hal yang tidak mungkin terjadi, bukannya misteriusNullReferenceException
.An object reference is required for the non-static field, method, or property 'WebException.Response'
menggunakan kode ini.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 } }
sumber
throw
(putar ulang) di akhir Andacatch
, jika tidak, ini hanya akan memakan jenis lainnya secara diam-diamWebException
.WebRequest
tidak diimplementasikanIDisposable
.Di C # 6 Anda dapat menggunakan filter pengecualian .
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 }
sumber
Saya belum menguji ini, tetapi seharusnya berhasil
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; }
sumber
catch
blok, mengingat saya memiliki kode yang sama persis dalam percobaan sebagai OP. Anda harus benar-benar mengabaikan pertanyaan ini sama sekali karena kode OP itu.Saya rasa jika Anda menemukan WebException ada beberapa informasi di sana yang dapat Anda gunakan untuk menentukan apakah itu adalah 404. Itulah satu-satunya cara yang saya ketahui saat ini ... Saya tertarik untuk mengetahui yang lain ...
catch(WebException e) { if(e.Status == WebExceptionStatus.ProtocolError) { var statusCode = (HttpWebResponse)e.Response).StatusCode); var description = (HttpWebResponse)e.Response).StatusDescription); } }
sumber
Lihat snipit ini. GetResponse akan menampilkan WebRequestException. Tangkap itu dan Anda bisa mendapatkan kode status dari respons.
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); }
ini berasal dari http://msdn.microsoft.com/en-us/library/system.net.webexception.status.aspx
sumber
Tangkap jenis pengecualian yang tepat
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"); }
sumber
e.Response
asHttpWebResponse
sebelum mendapatkan akses keStatusCode
.Lihat di MSDN tentang status tanggapan:
... catch(WebException e) { Console.WriteLine("The following error occured : {0}",e.Status); } ...
sumber
Untuk orang-orang VB.NET yang menjelajah ini, saya yakin kami dapat menangkap pengecualian hanya jika itu benar-benar adalah 404. Sesuatu seperti:
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
sumber
ketika POST atau GET data ke server menggunakan kelas WebRequest maka jenis pengecualiannya adalah WebException. Di bawah ini adalah kode untuk pengecualian file tidak ditemukan
//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); } }
sumber