Apollidore
Apollidore

Reputation: 183

How to use try catch nicely in multiple methods?

Sorry if my question is stupid, but I have this kind of code :

public Object1 Method1(Object2 parameter)
{
    try
    {
        return this.linkToMyServer.Method1(parameter);
    }
    catch (Exception e)
    {
        this.Logger(e);
    }

    return null;
}

public Object3 Method2(Object4 parameter)
{
    try
    {
        return this.linkToMyServer.Method2(parameter);
    }
    catch (Exception e)
    {
        this.Logger(e);
    }

    return null;
}

/* ... */

public ObjectXX Method50(ObjectXY parameter)
{
    try
    {
        return this.linkToMyServer.Method50(parameter);
    }
    catch (Exception e)
    {
        this.Logger(e);
    }

    return null;
}

I think you see the pattern. Is there a nice way to have only one try catch and to pass a generic method in this try catch ?

Instinctively I'd use a delegate, but delegates have to have the same signature right ?

Thanks in advance.

Regards.

Upvotes: 4

Views: 2236

Answers (3)

TarmoPikaro
TarmoPikaro

Reputation: 5253

One example of such central handling can be found from chocolatey open source git.

Centralization happens using two static public methods FaultTolerance.try_catch_with_logging_exception - for example user of this function would need to write something like this:

ChocolateyPackageService.cs#L1073

and there are two functions which handles this kind of call -

  1. With Func parameter

  2. With Action parameter

Other arguments to function are up to you to decide if you want to have them or not - they could adjust or log specific error message once exception occurs.

(All links are provided with absolute points in git history, so will not get broken in future).

Upvotes: 0

Jay
Jay

Reputation: 1309

This might be useful to you.

public object BaseMethod(object[] userParameters,String FunctionName)
{
  try
   {    
          Type thisType = this.GetType();
          MethodInfo theMethod = thisType.GetMethod(FunctionName);
          object returnObj;
          returnObj = theMethod.Invoke(this, userParameters);
          return returnObj;
   }
   catch (Exception e)
   {
            this.Logger(e.InnerException);

    }
}

Upvotes: 1

Sriram Sakthivel
Sriram Sakthivel

Reputation: 73502

Whenever you see code like this you can apply Template Method Pattern.

May be something like this:

private TResult ExecuteWithExceptionHandling<TParam, TResult>(TParam parameter, Func<TParam, TResult> func)
{
    try
    {
        return func(parameter);
    }
    catch (Exception e)
    {
        this.Logger(e);
    }
    return default(TResult);
}

public Object1 Method1(Object2 parameter)
{
    return ExecuteWithExceptionHandling(parameter, linkToMyServer.Method1);
}

public Object3 Method2(Object4 parameter)
{
    return ExecuteWithExceptionHandling(parameter, linkToMyServer.Method2);
}

And so on...

Upvotes: 9

Related Questions