Я бы посоветовал вам отметить исключение, если ваша программа не может достичь ожидаемого постусловия.Если кто-то дважды вызывает вашу процедуру инициализации, и состояние системы после ее повторного вызова будет таким же, как если бы он был вызван только один раз, то, вероятно, нет необходимости создавать исключение.Если состояние системы после второго вызова не будет соответствовать ожиданиям вызывающего абонента, то должно быть сгенерировано исключение.
В общем, я думаю, что более полезно думать о состоянии, чем о действии.Чтобы использовать аналогию, попытка открыть как «запись нового» файла, который уже открыт, должна либо завершиться неудачей, либо привести к закрытию-стиранию-открытию.Он не должен просто выполнять no-op, так как программа будет ожидать записи в пустой файл, время создания которого совпадает с текущим временем.С другой стороны, попытка закрыть файл, который уже закрыт, как правило, не должна рассматриваться как ошибка, поскольку желательно, чтобы файл был закрыт.
Кстати, часто полезно иметь пробную версию.метода, который может вызвать исключение.Было бы хорошо, например, иметь Control.TryBeginInvoke для таких вещей, как процедуры обновления (если потокобезопасное свойство элемента управления изменяется, обработчик свойства хотел бы, чтобы элемент управления обновлялся, если он все еще существует, но на самом деле не будетне забывайте, что элемент управления удаляется; немного утомительно, когда не удается избежать исключения первого шанса, если элемент управления закрывается при обновлении его свойства).