Question

I have the following code courtesy of an answer posted by Jean-Michel Bezeau

bool isAlive = false;
string fixedAddress = "http://localhost:8732/Design_Time_Addresses/WCFService/mex";
System.ServiceModel.Description.ServiceEndpointCollection availableBindings = System.ServiceModel.Description.MetadataResolver.Resolve(typeof(WCFService.IAlive), new EndpointAddress(fixedAddress));
ChannelFactory<WCFService.IAlive> factoryService = new ChannelFactory<WCFService.IAlive>(availableBindings[0]);
WCFService.IAlive accesService = factoryService.CreateChannel();
isAlive = accesService.IsAlive();

I would like my program to continue even if the WCF Service can't be reached so that I can notify someone via email and add it to a log. I thought of doing it like this:

bool isAlive = false;
try
{
    string fixedAddress = "http://localhost:8732/Design_Time_Addresses/WCFService/mex";
    System.ServiceModel.Description.ServiceEndpointCollection availableBindings = System.ServiceModel.Description.MetadataResolver.Resolve(typeof(WCFService.IAlive), new EndpointAddress(fixedAddress));
    ChannelFactory<WCFService.IAlive> factoryService = new ChannelFactory<WCFService.IAlive>(availableBindings[0]);
    WCFService.IAlive accesService = factoryService.CreateChannel();
    isAlive = accesService.IsAlive();
}
catch {}
finally
{
    if (isAlive)
    {
        //add success message to log
    }
    else
    {
        //add warning message to log
        //send email notification
    }
}

However, I don't like catching all exceptions like that (I know it's bad practice). What's the best way to go about this?

Are there particular exceptions I should be catching? Or, is this a good time to implement a using statement (if so can I have some help with how)?

Was it helpful?

Solution

The exception could be lots of things - it might be just a timeout, or a 404 error, a 500 error, a connection reset error... so there's probably a bunch of exceptions that can be thrown. In this particular case I wouldn't have a problem with a global catch.

You might want to consider retries as well, if it fails the first time try again, in case it was just a timeout.

Alternatively if you already have global error handling on your app, you might not want to swallow the exception, so you could just use the finally block without the catch:

try 
{
    ....
}
finally 
{
    ....
}

But you'd only want to do this if it was a genuine error that the app couldn't handle or resolve by itself.

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