Reputation: 92
I'm creating my own weather api by calling third party api openweather. I don't know how to handle WebException which occurs when I provide city which doesn't exist as an input, it gives me status code 404 from openweatherapi and I don't know how to handle that error my application always crashes due to unhandled exception
Thank you for helping :D
code on which I'm working
public void WeatherDetail(string City)
{
//Assign API KEY which received from OPENWEATHERMAP.ORG
string appId = "*******";
//API path with CITY parameter and other parameters.
string url = string.Format("http://api.openweathermap.org/data/2.5/weather?q={0}&appid={1}", City, appId);
using (WebClient client = new WebClient())
{
string json = "";
try
{
json = client.DownloadString(url);
}
catch (system.net.webexception)
{
// how to handle WebException ?
}
//Converting to OBJECT from JSON string.
Root weatherInfo = (new JavaScriptSerializer()).Deserialize<Root>(json);
//Special VIEWMODEL design to send only required fields not all fields which received from
ResultViewModel rslt = new ResultViewModel();
DateTime aDate = DateTime.Now;
string today = aDate.ToString("yyyy-MM-dd");
rslt.Country = weatherInfo.sys.country;
if(City == "Thane" || City == "thane")
{
rslt.Name = "Thane";
}
else
{
rslt.Name = weatherInfo.name;
}
rslt.Lat = weatherInfo.coord.lat;
rslt.Lon = weatherInfo.coord.lon;
rslt.Description = weatherInfo.weather[0].description;
rslt.Temp = weatherInfo.main.temp;
rslt.WeatherIcon = weatherInfo.weather[0].icon;
rslt.Pressure = weatherInfo.main.pressure;
rslt.Deg = weatherInfo.wind.deg;
rslt.WindSpeed = weatherInfo.wind.speed;
rslt.Main = weatherInfo.weather[0].main;
rslt.WeatherId = weatherInfo.weather[0].id;
rslt.Sunrise = weatherInfo.sys.sunrise;
rslt.Sunset = weatherInfo.sys.sunset;
rslt.Date = today;
rslt.Id = weatherInfo.id;
try
{
con.Open();
}
catch (System.Data.SqlClient.SqlException ex)
{
throw ex;
}
cmd = new SqlCommand("insert into CityWeather (lon, lat, name, country, weatherid, main, description, temp, pressure, sunrise, sunset, windspeed, deg, weatherIcon) values (" +
"'" + rslt.Lon + "','" + rslt.Lat + "','" + rslt.Name + "','" + rslt.Country + "', '" + rslt.WeatherId + "','" + rslt.Main + "', '" + rslt.Description + "','" + rslt.Temp + "', '" + rslt.Pressure + "', '" + rslt.Sunrise + "','" + rslt.Sunset + "', '" + rslt.WindSpeed + "', '" + rslt.Deg + "', '" + rslt.WeatherIcon + "')"
, con);
cmd.ExecuteNonQuery();
con.Close();
}
}
Thank you for helping :D
Upvotes: 0
Views: 605
Reputation: 1810
You can check if the remote service returned an error message in the error, like so:
catch (WebException wex)
{
if (wex.Status == WebExceptionStatus.ProtocolError)
{
using (Stream responStream = wex.Response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(responStream))
{
String response = reader.ReadToEnd();
//check response content here, and return an error to your client
}
}
}
}
Upvotes: 1