Гость
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Null VS Exception / 25 сообщений из 44, страница 1 из 2
05.08.2020, 09:50
    #39986600
listtoview
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Null VS Exception
как правильно делать, вернуть null или выбросить исключение?
например здесь

Код: c#
1.
2.
3.
4.
public Book GetById(int id)
        {
            return books.Single(b => b.Id == id);
        }
...
Рейтинг: 0 / 0
05.08.2020, 09:56
    #39986605
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Null VS Exception
Зависит от того, плановая это ситуация или исключительная.
Но много зависит и от окружения - как оно построено.
...
Рейтинг: 0 / 0
05.08.2020, 09:57
    #39986606
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Null VS Exception
listtoview,
возвращать null очень плохой стиль кода.
...
Рейтинг: 0 / 0
05.08.2020, 09:58
    #39986607
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Null VS Exception
vb_sub
возвращать null очень плохой стиль кода.
Исключение не всегда удобно. Тогда уж возвращать Result<Book>, если не null
...
Рейтинг: 0 / 0
05.08.2020, 10:48
    #39986625
listtoview
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Null VS Exception
vb_sub
listtoview,
возвращать null очень плохой стиль кода.

Почему?
например это поиск
если ничего не найдено, зачем возвращать объект? логичнее вернуть ничего
не?
...
Рейтинг: 0 / 0
05.08.2020, 11:19
    #39986633
monstrU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Null VS Exception
listtoview,

потому что если ты ждешь из функции объект Book, и будешь возвращать null, то при обращении к book.Id у тебя в runtime вылетит ошибка. ее тяжело отловить. если еще и другие люди по проекту работают, то к проблемам такой подход приведет.
можно результат операции возвращать успешно нашли или нет, или паттерном Пустой объект воспользоваться.
возвращать объект Book, но в нем завести какой то признак, который обозначает что объект пустой. потом написать функцию IsEmptyObject, которая на book.IsEmptyObject() вернет true когда объект в базе найден не был
...
Рейтинг: 0 / 0
05.08.2020, 12:54
    #39986658
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Null VS Exception
Как вариант можно использовать следующую обертку, которой пользуюсь для ответа из API, но как обертка для результата метода тоже подойдет.
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
    /// <summary>
    ///Обертка для ответа клиенту
    /// </summary>
    public class ApiDataResponse
    {
        /// <summary>
        /// Response payload
        /// </summary>
        public object Body { get; }

        public bool IsSuccess => Errors == null;

        protected IList<string> Errors;

        /// <summary>
        /// Добавление ошибок
        /// </summary>
        /// <param name="errors">Список ошибок</param>
        public void AddErrors(IEnumerable<string> errors)
        {
            if (Errors == null)
                Errors = new List<string>();

            foreach (var error in errors)
                Errors.Add(error);
        }

        public ApiDataResponse(object body = null)
        {
            Body = body;
        }
    }

    /// <summary>
    /// Запрос завершился с ошибкой
    /// </summary>
    public class ErrorApiResponse : ApiDataResponse
    {
        public ErrorApiResponse(string error) : base(null)
        {
            AddErrors(new string[1] { error });
        }

        /// <summary>
        /// Ошибки
        /// </summary>
        public string Error => Errors.Aggregate((a, b) => $"{a}{Environment.NewLine}{b}");
    }
    public class ApiDataResponse<T> : ApiDataResponse
    {
        public ApiDataResponse(T body) : base(body)
        {
        }
    }
...
Рейтинг: 0 / 0
05.08.2020, 13:43
    #39986683
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Null VS Exception
listtoview
Почему?
например это поиск
если ничего не найдено, зачем возвращать объект? логичнее вернуть ничего
Но ты же привел другой пример.
Вот смотри. Допустим ты хочешь получить объект по id, при этом по твоей бизнес-логике объекты никогда не удаляются из этой таблицы. Таким образом, если id получен валидным путем, то он должен быть валидным и объект обязан быть найден. Если не найден, то это действительно исключение (например злой хакер ручками подменил id в запросе), ты такую ситуацию не ожидаешь.

Что касается поиска - обычно поиск по каким-то критериям возвращает массив. Если поиск ничего не нашел, то он возвращает пустой массив, так что тут о null речь не идет.
...
Рейтинг: 0 / 0
05.08.2020, 13:48
    #39986689
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Null VS Exception
Может быть еще такая ситуация, что объект существует, но у пользователя на него нет прав. Тут возвращать объект нельзя, но и null возвращать некорректно.
Можно наплодить и выбрасывать специфические исключения для разных ситуаций, но это не самый удобный путь, удобнее возвращать Result, в котором можно классифицировать причину.
К примеру есть сообщения, которые нельзя показывать пользователю (только в логи писать или показывать админу), а есть которые для пользователя предназначены. В Result-е ты можешь сделать соответствующие поля.

В общем, зависит во-многом от того, как ты строишь свою архитектуру. Все, что я сказал - не догма, но в любом случае лучше принять и придерживаться единого стиля.
...
Рейтинг: 0 / 0
05.08.2020, 14:04
    #39986711
Дмитрий Мух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Null VS Exception
listtoview
как правильно делать, вернуть null или выбросить исключение?
например здесь

Код: c#
1.
2.
3.
4.
public Book GetById(int id)
        {
            return books.Single(b => b.Id == id);
        }


Именно этот код должен вернуть null, а не падать.
...
Рейтинг: 0 / 0
05.08.2020, 14:29
    #39986728
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Null VS Exception
Можешь еще вот этот срач почитать
Исключения vs коды возвратов
там немножко про другое, ну так, для погружения в вопрос )))
...
Рейтинг: 0 / 0
05.08.2020, 14:36
    #39986736
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Null VS Exception
Дмитрий Мух
listtoview
как правильно делать, вернуть null или выбросить исключение?
например здесь

Код: c#
1.
2.
3.
4.
public Book GetById(int id)
        {
            return books.Single(b => b.Id == id);
        }


Именно этот код должен вернуть null, а не падать.

Ты что, белены объелся? :) это же не SingleOrDefault
Single вернет найденный элемент, если в последовательности он есть и он только 1, если его нет или он не 1 бросит исключение
SingleOrDefalut вернет найденный элемент, если он только 1, если элемент не найден, то вернет null
First - вернет первый найденный элемент или бросит исключение
FirstOrDefault - вернет первый найденный элемент или null без исключений
...
Рейтинг: 0 / 0
05.08.2020, 14:42
    #39986738
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Null VS Exception
Roman Mejtes
Ты что, белены объелся? :) это же не SingleOrDefault
Дима имел ввиду не реализацию, а подход
Данная реализация понятно, что исключение выдаст )
...
Рейтинг: 0 / 0
05.08.2020, 14:45
    #39986742
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Null VS Exception
И в продолжение - в данный коде действительно не стоит выбрасывать исключение, потому что это исключением смешается с возможными исключениями от БД (например транспортного уровня или блокировки), и потом придется эти исключения где-то выше разделять на причины.
...
Рейтинг: 0 / 0
05.08.2020, 17:08
    #39986813
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Null VS Exception
listtoview,

если не найдено -- 404
...
Рейтинг: 0 / 0
05.08.2020, 18:12
    #39986837
Дмитрий Мух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Null VS Exception
Shocker.Pro
Roman Mejtes
Ты что, белены объелся? :) это же не SingleOrDefault
Дима имел ввиду не реализацию, а подход
Данная реализация понятно, что исключение выдаст )



я написал о том, как этот код должен бы себя вести на самом деле, а не как он ведёт себя сейчас

ведь наверняка мало кто ожидает, что метод с сигнатурой
Код: c#
1.
Book GetById(int id)


кинет исключения, если нет записи о книге с указанным идентификатором

это примерно как ожидать, что запрос
Код: sql
1.
SELECT * FROM Books WHERE Id = 123


с**а, выкинет исключение
...
Рейтинг: 0 / 0
05.08.2020, 18:14
    #39986839
Дмитрий Мух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Null VS Exception
hVostt
если не найдено -- 404

если нет доступа - 403

и мы возвращаемся к
...
Рейтинг: 0 / 0
05.08.2020, 18:18
    #39986842
Дмитрий Мух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Null VS Exception
И вообще предлагаю топика ТС-а нещадно удалять, пока он не научится вопросы задавать...
...
Рейтинг: 0 / 0
05.08.2020, 18:26
    #39986844
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Null VS Exception
hVostt
если не найдено -- 404
Дмитрий Мух
если нет доступа - 403
причем тут... это же репо, а не контроллер )))
...
Рейтинг: 0 / 0
05.08.2020, 18:26
    #39986845
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Null VS Exception
Дмитрий Мух
И вообще предлагаю топика ТС-а нещадно удалять, пока он не научится вопросы задавать...
а чем плох например этот вопрос? )
...
Рейтинг: 0 / 0
05.08.2020, 18:28
    #39986848
Дмитрий Мух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Null VS Exception
Shocker.Pro
hVostt
если не найдено -- 404
Дмитрий Мух
если нет доступа - 403
причем тут... это же репо, а не контроллер )))

1. с чего это вдруг именно репо?
2. и почему это доступ должен проверятся именно на уровне контроллера?
...
Рейтинг: 0 / 0
05.08.2020, 18:32
    #39986849
Дмитрий Мух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Null VS Exception
Shocker.Pro
Дмитрий Мух
И вообще предлагаю топика ТС-а нещадно удалять, пока он не научится вопросы задавать...
а чем плох например этот вопрос? )

Вопрос:
listtoview
как правильно делать, вернуть null или выбросить исключение?
например здесь

Ответ: например здесь - null, например там - исключение.

Вот ответь мне: ТС-а "например здесь" интересует, или вообще?
...
Рейтинг: 0 / 0
05.08.2020, 18:39
    #39986850
Дмитрий Мух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Null VS Exception
Не удивлюсь, если вдруг окажется, что ТС открыл для себя поведение метода Single и из-за этого и задался вопросом.
...
Рейтинг: 0 / 0
05.08.2020, 23:48
    #39986903
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Null VS Exception
Дмитрий Мух
hVostt
если не найдено -- 404

если нет доступа - 403

и мы возвращаемся к




Мне к этому приходится возвращаться довольно часто при интеграции со всякими легаси и поделками надмозгов.

Особенно за 200 ОК, который содержит детали ошибок внутри -- просто кол в попу, и провернуть.
...
Рейтинг: 0 / 0
05.08.2020, 23:57
    #39986904
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Null VS Exception
Кстати, возвращаясь к теме топика, на который сослались...

skyANA
Всё это фигня...
Следует возвращать OperationResult да и вообще писать в функциональном стиле


Показало себя на реальном боевом проекте как полнейшее фуфло. Никакого профита, головняк, и почва для генерации говнокода на ровном месте.

Пока в C# не будет DU, не стоит заниматься подобным извращением. Не рекомендую.
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Null VS Exception / 25 сообщений из 44, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]