Сокращение дублирования кода обработки ошибок в 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
} );
Мне это немного нравится, но это оставляет желать лучшего. Я'Мне бы хотелось услышать, как другие люди решат такую проблему.