nikunjM
nikunjM

Reputation: 590

How to catch exception?

I am trying to call api and check its response, but when ever some wrong value is passed it stops the program. I want to add exception during request and response but not sure how to write in function.

This is how i call my REST call

public dynamic APICalls(JObject ljson, string endpoints, string method)
        {
            var httpReq = (HttpWebRequest)HttprequestObject(endpoints, method);
            using (var streamWriter = new StreamWriter(httpReq.GetRequestStream()))
            {
                streamWriter.Write(ljson);
                streamWriter.Flush();
                streamWriter.Close();
            }
            var httpResponse = (HttpWebResponse)httpReq.GetResponse();
            var result = "";
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                result = streamReader.ReadToEnd();
            }
            return result;
            //return "Success";
            //not sure what to return 
            //here i have to add sql server code to enter into database
        }

THis is code for request

public dynamic HttprequestObject(string endpoints, string method)
        {
            string url = Settings.API_TEST_VALUE + endpoints;
            var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
            httpWebRequest.ContentType = "application/json";
            httpWebRequest.Method = method;
            return httpWebRequest;
        }

And right before request and right after response i want to catch exception.

At this point i have to catch exception

 var httpResponse = (HttpWebResponse)httpReq.GetResponse();

If some one gives me hint how to catch that before it stops program.

There are 400, 401,402 errors, if something is wrong API sends json

For instance, while creating user :-- Email id already exists

But that points stops json and stops program..

Using try catch it will stop program, I want it to run and want to receive resposne.

Actually, API will send error . For instance, status will be ;---401 UNAUTHORIZED and resposnse will be

{ "reason": "Email already registered.", "success": false } 

I am changed my code and

   HttpWebResponse httpResponse; 
            try
            {
               //HttpWebResponse myHttpWebResponse = (HttpWebResponse)httpReq.GetResponse();
               httpResponse = (HttpWebResponse)httpReq.GetResponse();
               //myHttpWebResponse.Close();

               using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
               {
                   result = streamReader.ReadToEnd();
               }
            }
            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);
            }

            return result;
            //return "Success";
            //not sure what to return 
            //here i have to add sql server code to enter into database
        }

This is the new code, but I m not getting Json as return value, So i can show specific error. For below Json what should I write?

{ "reason": "Email already registered.", "success": false }

please I m new to c# and if something is not clear please modify or ask question? thank you

Upvotes: 1

Views: 1011

Answers (4)

nikunjM
nikunjM

Reputation: 590

Ok,Finally I am able to Solve this.. Thanks everyone for you help.

This worked for me. I think I was not reading whole response.. So some how I think I realized and now its working ..

HttpWebResponse httpResponse;
            try
            {
                httpResponse = (HttpWebResponse)httpReq.GetResponse();
                using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
                {
                    result = streamReader.ReadToEnd();
                }
            }
            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);
                    using (Stream data = e.Response.GetResponseStream())
                    using (var reader = new StreamReader(data))
                    {
                        string text = reader.ReadToEnd();
                        Console.WriteLine(text);
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }

Upvotes: 0

Yuriy A.
Yuriy A.

Reputation: 752

You can handle your web exceptions to get HttpStatusCode and Response Message this way:

public void SendAndGetResponseString()
{
    try
    {
        // Here you call your API
    }
    catch (WebException e)
    {
        var result = GetResponceFromWebException(e);
        if (result != null){
            // 
            // Here you could use the HttpStatusCode and HttpResponseMessage
            //
        }                   

        throw;
    }
    catch (Exception e)
    {
        // log exception or do nothing or throw it          
    }
}


private HttpRequestResponce GetResponceFromWebException(WebException e)
{
    HttpRequestResponce result = null;
    if (e.Status == WebExceptionStatus.ProtocolError)
    {
        try
        {
            using (var stream = e.Response.GetResponseStream())
            {
                if (stream != null)
                {
                    using (var reader = new StreamReader(stream))
                    {
                        var responseString = reader.ReadToEnd();
                        var responce = ((HttpWebResponse) e.Response);

                        result = new HttpRequestResponce(responseString, responce.StatusCode);
                    }
                }
            }
        }
        catch (Exception ex)
        {
            // log exception or do nothing or throw it
        }
    }
    return result;
}


public class HttpRequestResponce {
    public HttpStatusCode HttpStatusCode { get;set; }
    public string HttpResponseMessage {get;set;}

    public HttpRequestResponce() { }

    public HttpRequestResponce(string message, HttpStatusCode code)
    {
          HttpStatusCode=code;
          HttpResponseMessage=message;
    }
}

Upvotes: 2

Yuval Itzchakov
Yuval Itzchakov

Reputation: 149598

What you're looking for is called a try-catch statement:

try
{
     var httpResponse = (HttpWebResponse)httpReq.GetResponse();
}
catch (WebException e)
{
    // Here is where you handle the exception.
}

Using WebException as the type in the catch statement means only exceptions of that particular type will be caught.

In case an exception occurs, the e variable will contain exception details, such as a message passed from the method which three the exception and any inner exceptions encapsulated inside.

Upvotes: 3

Erik Karlstrand
Erik Karlstrand

Reputation: 1537

You encapsulate whatever method call or code block you want to prevent from throwing unhandled exceptions.

try
{
    // code here
}
catch (Exception)
{
    // here you may do whatever you want to do when an exception is caught
}

Upvotes: 1

Related Questions