Шаблон, позволяющий избежать вложенных блоков try catch?

Рассмотрим ситуацию, когда у меня есть три (или более) способа выполнения вычислений, каждый из которых может завершиться ошибкой с исключением. Чтобы попытаться выполнить каждое вычисление, пока мы не найдем тот, который будет успешным, я сделал следующее:

double val;

try { val = calc1(); }
catch (Calc1Exception e1)
{ 
    try { val = calc2(); }
    catch (Calc2Exception e2)
    {
        try { val = calc3(); }
        catch (Calc3Exception e3)
        {
            throw new NoCalcsWorkedException();
        }
    }
}

Есть ли какой-нибудь общепринятый шаблон, который позволяет добиться этого лучше? Конечно, я мог бы обернуть каждое вычисление во вспомогательный метод, который возвращает null в случае сбоя, а затем просто использовать оператор ?? , но есть ли способ сделать это в более общем плане (т.е. без необходимости писать вспомогательный метод. метод для каждого метода, который я хочу использовать)? Я думал о написании статического метода с использованием универсальных шаблонов, которые обертывают любой заданный метод в try / catch и возвращают null в случае неудачи, но я не уверен, как бы я поступил с этим. Есть идеи?

112
задан aculich 18 October 2011 в 19:59
поделиться