Question

I have to process items off a queue.

Deleting items off the queue is a manual call to Queue.DeleteMessage. This needs to occurs regardless of whether or not the processing succeeds.

var queueMessage = Queue.GetMessage();

try
{
    pipeline.Process(queueMessage);
}
catch (Exception ex)
{
    try
    {
        Logger.LogException(ex);
    }
    catch { }
}
finally
{
    Queue.DeleteMessage(queueMessage);
}

Problem:

On failure, I log the error to some data store. If this logging fails (perhaps the data store is not available), I still need the message to be deleted from the queue.

I have wrapped the LogException call in another try catch. Is this the correct way or performing thing?

Was it helpful?

Solution

Following code is enough. finally blocks execute even when exception is thrown in catch block.

var queueMessage = Queue.GetMessage();    
try
{
    pipeline.Process(queueMessage);
}
catch (Exception ex)
{
    Logger.LogException(ex);
}
finally
{
    Queue.DeleteMessage(queueMessage);//Will be executed for sure*
}

OTHER TIPS

The finally block always executes, even if it throws an unhandled error (unless it end the app). So yes.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top