Создание пользовательского класса утверждения - PullRequest
1 голос
/ 04 декабря 2011

Я следую принципу Fail Fast . Я задаюсь вопросом, является ли хорошей практикой наличие класса Assertion для проверки аргументов моего параметра конструктора.

Например:

public static class Assertions
{
    public static void ParamterIsNotNull(object subject, string paramName = "")
    {
        if (subject == null) throw new ArgumentNullException(paramName, "Paramter cannot be null");
    }
}

и используется:

public class Test
{
    public Test(object obj)
    {
        Assertions.ParamterIsNotNull(obj, "obj");
    }
}

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

1 Ответ

1 голос
/ 04 декабря 2011

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

В этом случае пример системы Batch был очень удачным - хотя 1 элемент из пакета может не работать, пользователь, скорее всего, захочет получить остальные.чтобы быть осторожным, вот почему вы генерируете исключение, которое перехватывается глобальным обработчиком (глобальный обработчик решает продолжить со следующего элемента и объединяет ошибку, чтобы он мог показать ее пользователю и отправить уведомление команде разработчиков).

Таким образом, оба способа завершены - большая часть работы пользователей выполнена, и принцип быстрого отказа также срабатывает.

Так что это зависит от вашего конкретного случая - возможно, если ваш класс участвует вдругие операции будут иметь более глобальный класс (или класс вызывающего, который его использует), который будетможет лучше решить, может ли он продолжаться или нет.

С другой стороны - ваш класс не должен быть в состоянии определить, может ли вызывающий класс выполнить какую-либо другую работу в случае сбоя, поэтому вам нужно броситьваше исключение в конструкторе, да.Это то, что я думаю - ДА :).Поэтому, если ваш класс представляет элемент пакета - вызывающая сторона, скорее всего, поймает исключение и продолжит работу.Если это какой-то класс точки входа - тогда вы, вероятно, хотите изящно обработать исключение (или вообще не выдавать его), показать пользователю сообщение об ошибке и предоставить подробную информацию (журнал), чтобы команда разработчиков могла легко сообщитьгде проблема была.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...