Я никогда не был полностью доволен тем, как работает обработка исключений, есть много исключений и попытка/улов приносит в таблицу (разворачивание стека и т. Д.), Но, похоже, это ломает много модели OO в процессе ,Сокращение дублирования кода обработки ошибок в C#?
Во всяком случае, вот проблема:
Допустим, у вас есть некоторый класс, который оборачивает или включает в себя сетевые файловые операции ввода-вывода (чтение и запись например в какой-то файл на каком-то конкретном пути 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
});
Мне нравится это несколько, но она оставляет желать лучшего. Я хотел бы услышать, как другие люди решат такую проблему.
Просто общий FYI: [почти * всегда * лучше] (http://philosopherdeveloper.wordpress.com/2010/05/05/re-throwing-caught-exceptions/) просто «бросить», вместо этого `throw e;` – 2010-09-13 03:34:47