Сокращение дублирования кода обработки ошибок в C #?

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

Во всяком случае, здесьС проблемой:

Позволять'скажем, у вас есть какой-то класс, который оборачивает или включает в себя операции ввода-вывода сетевых файлов (например, чтение и запись в некоторый файл по какому-то конкретному пути UNC). По разным причинам вы неВы не хотите, чтобы эти операции ввода-вывода потерпели неудачу, поэтому, если вы обнаружите, что они терпят неудачу, вы повторите их, и вы продолжаете повторять их до тех пор, пока они не будут успешными или вы не достигнете тайм-аута. У меня уже есть удобный класс RetryTimer, который я могу создать и использовать для ожидания текущего потока между повторными попытками и определения истечения времени ожидания и т. Д.

Проблема в том, что у вас есть несколько операций ввода-вывода в нескольких методах этого класса, и вам нужно обернуть каждую из них в логику try-catch / retry.

Вот'Пример кода:

RetryTimer fileIORetryTimer = new RetryTimer(TimeSpan.FromHours(10));
bool success = false;
while (!success)
{
    try
    {
        // do some file IO which may succeed or fail
        success = true;
    }
    catch (IOException e)
    {
        if (fileIORetryTimer.HasExceededRetryTimeout)
        {
            throw e;
        }
        fileIORetryTimer.SleepUntilNextRetry();
    }
}

Итак, как избежать дублирования большей части этого кода для каждой операции ввода-вывода файла во всем классе? Мое решение состояло в том, чтобы использовать анонимные блоки делегатов и единственный метод в классе, который выполнил переданный ему блок делегатов. Это позволило мне делать такие вещи другими способами:

this.RetryFileIO( delegate()
    {
        // some code block
    } );

Мне это немного нравится, но это оставляет желать лучшего. Я'Мне бы хотелось услышать, как другие люди решат такую проблему.

Ответы на вопрос(4)

Ваш ответ на вопрос