Несколько методов с одинаковой логикой try/catch

У меня есть программа на C# с несколькими методами с разными параметрами и разными типами возвращаемых данных, но большинство из них имеют блок try/catch с одинаковой обработкой логики исключений. Есть несколько операторов catch для всех методов, но логика внутри них одинакова для всех методов.

Есть ли способ создать вспомогательный метод, чтобы у меня не было дублирующегося кода в улове?

    public static async Task<long> Method1(string requestedKey)
    {
        try
        {
            //code
            return value;
        }
        catch (Exception1 ex)
        {
            Exception1Handler(ex);
        }
        catch (Exception2 ex)
        {
            Exception2Handler(ex);
        }
        catch (Exception3 ex)
        {
            Exception3Handler(ex);
        }
        catch (Exception ex)
        {               
        }

        return 0;
    }


    public static async Task<T> Method2(string key, string value)
    {
        try
        {
            //code
            return value;
        }
        catch (Exception1 ex)
        {
            Exception1Handler(ex);
        }
        catch (Exception2 ex)
        {
            Exception2Handler(ex);
        }
        catch (Exception3 ex)
        {
            Exception3Handler(ex);
        }
        catch (Exception ex)
        {               
        }

         return default(T);
    }

Как я могу сгруппировать операторы catch в вспомогательном методе, чтобы у меня не было дублирующегося кода?

2 ответа

Решение

Вместо этого:

void AA(string B)
{
    try
    {
        //Do something
    }
    catch (Exception)
    {
        //Do something else
    }
}

void AA(string B, string C)
{
    try
    {
        //Do something
    }
    catch (Exception)
    {
        //Do something else
    }
}

и вводить одно и то же исключение снова и снова (я предполагаю, что они будут точно такими же, поскольку вы так говорите в своем вопросе), вы можете сделать что-то вроде этого:

void CallerMethod()
{
    try
    {
        AA("");
        AA("", "");
    }
    catch (Exception)
    {
        //My only one exception
    }
}

void AA(string B)
{
    //Do something
}

void AA(string B, string C)
{
    //Do something
}

Таким образом, если какой-либо из ваших перегруженных методов выдаст исключение, вы можете обработать их только из одного места

Если идея состоит в том, чтобы избежать дублирования блоков catch, вы можете использовать следующий подход

public void HandleException(Action action)
{
    try
    {
        action();
    }
    catch (Exception1 e)
    {
        // Exception1 handling
    }
    catch (Exception2 e)
    {
        // Exception2 handling
    }
    catch (Exception3 e)
    {
        // Exception3 handling
    }
    catch (Exception e)
    {
        // Exception handling
    }
}

...

HandleException(() => /* implementation */)
Другие вопросы по тегам