Несколько методов с одинаковой логикой 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 */)