Уместно ли использовать System.Exception в этой ситуации? - PullRequest
3 голосов
/ 05 июня 2011

Обычно он не одобряет использование System.Exception, но мне интересно, если это мой единственный выбор.

У меня есть этот сценарий

  1. Пользователь запрашивает задачу для редактирования
  2. Проверка прав доступа выполнена.
  3. Если все в порядке, извлекается строка из базы данных
  4. Затем выполняется обновление задачи и обновляется столбец, чтобы сказать, что он заблокирован.
  5. Некоторые временные зоны применяются к этой задаче для преобразования дат в местное время.
  6. Задание отображается для пользователя.

Так что, если что-то случится между шагами с 1 по 4,задание все еще хорошо, поскольку оно не заблокировано.Однако если на шаге 5 произойдет сбой, и я не смогу отобразить задачу пользователю, файл будет заблокирован и будет заблокирован до тех пор, пока не будет запущено запланированное задание, чтобы принудительно разблокировать файлы, заблокированные на длительный срок.

Это своего родане идеален, так как это может быть временный сбой, и в следующий раз, когда они запросят файл, он снова может работать.Но теперь им приходится ждать (так же, как и со всеми остальными подписчиками) X минут, пока он не разблокируется автоматически.

Поэтому моей первой мыслью было использование оператора finally, но это всегда выполняется независимо от того, что мне не удалось выяснить.как правильно сказать, что файл теперь заблокирован, не беспокойтесь о его разблокировке.

Или файл заблокирован, но что-то пошло не так, разблокируйте его.Было бы хорошо, если бы у C # было утверждение, которое выполнялось только тогда, когда произошло исключение.

Поэтому моя единственная другая мысль - это исключение, что, если что-то случится, оно разблокирует его там.Единственный случай, по которому это не произойдет, это исключение SQl, поскольку нет смысла пытаться что-то разблокировать, если база данных не работает.

Конечно, я бы использовал elmah для регистрации ошибки и медленного добавления лучших типов исключений по мере ихбудет происходить.

Так у кого-нибудь есть идеи получше?

Ответы [ 2 ]

4 голосов
/ 05 июня 2011

Не позволяйте совершенному становиться врагом добра. Поймать общее исключение совершенно нормально в этом сценарии. Если вы можете поймать и восстановить более конкретные типы исключений, сделайте это. Но иметь план выздоровления «все только что пошёл в ад» не просто хорошо, но похвально.

2 голосов
/ 05 июня 2011

Перехват System.Exception допустим, если он является вершиной потока, и вы не хотите, чтобы ваша программа вылетала при любых обстоятельствах. В общем, перехват System.Exception - плохая идея, потому что вы должны иметь некоторое представление о том, какие ошибки могут произойти, например, когда случается что-то совершенно неожиданное, он всплывает до вершины вашего потока, где вы ловите System.Exception и, возможно, предоставить информацию трассировки стека и т. д. для целей отладки.

В вашем случае, поскольку вы беспокоитесь о том, что «что-то плохое» происходит на шаге 5, который касается преобразований часовых поясов, вы можете попытаться предвидеть, какие конкретные исключения или классы исключений могут сработать там, и, в частности, перехватить их, обработать разблокировать соответствующим образом.

В качестве альтернативы, поскольку у вас, по-видимому, есть возможность создать указанное запланированное задание, которое находит заблокированные файлы и эффективно вызывает разблокировку, вы не можете использовать ту же логику в своем блоке finally? например если он заблокирован, разблокируйте его, иначе noop.

...