user1911835
user1911835

Reputation: 55

Advice on exception handling in webservice

I need some advice on a good exception handling strategy in my webservice.

My web service methods are doing the standard CRUD operations against an Oracle database. Therefore, I have some methods that select data and return a dataset and others that do either an insert/update/ or delete and don't return anything.

Initially, I had all my code in each webservice method in a try-catch-finally catching an Oracle exception. I read some articles on the web that says this is not good and I should only surround something in try-catch if there is a potential for an exception. Now I am thinking that maybe it would be best if I put only my Insert/Update/Delete methods in try-catch-finally blocks.

So my questions are:

  1. Should I put all my methods in try-catch-finally? They all interact with Oracle and could potentially cause an exception. Or should I only do this for the Insert/Update and Delete methods?

  2. I don't really have any requirements on what they want to happen when an exception does occur. I am just going on common sense. I know that they definitely don't want the app to end. I am planning on logging the exception in some manner and re-throwing it to the client. I am doing this when there is an Oracle Exception.

Upvotes: 2

Views: 1248

Answers (2)

maxisam
maxisam

Reputation: 22715

Basically you need to do try-catch on every WebMethod. Since the event won't bubble up, I think there is no other better way.

However, you can use the trick in this post to make your life easier.

The way he does is creating a utility method like this and invoke that method by passing it a delegate to your web method logic.

private T Execute<T>(Func<T> body)
{
    //wrap everything in common try/catch
    try
    {
        return body();
    }
    catch (SoapException)
    {
        //rethrow any pre-generated SOAP faults
        throw;
    }
    catch (ValidationException ex)
    {
        //validation error caused by client
        ClientError innerError = new ClientError();
        //TODO: populate client error as needed
        //throw SOAP fault
        throw this.GenerateSoapException(
            "An error occurred while validating the client request.",
            SoapException.ClientFaultCode,
            innerError);
    }
    catch (Exception ex)
    {
        //everything else is treated as an error caused by server
        ServerError innerError = new ServerError();
        //TODO: populate server error as needed
        //TODO: log error
        //throw SOAP fault
        throw this.GenerateSoapException(
            "An unexpected error occurred on the server.",
            SoapException.ServerFaultCode,
            innerError);
    }
}

Upvotes: 2

Ilkka
Ilkka

Reputation: 306

I assume you are using ASP.NET WebMethods. My advice is that you always catch exceptions on the service layer, write a log and throw a SoapException. Basically you can try-catch on each service method (WebMethod). If you fail to do so, you would be exposing exception details to the client calling the service and that could be a potential security issue.

Upvotes: 1

Related Questions