powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Null VS Exception
25 сообщений из 44, страница 1 из 2
Null VS Exception
    #39986600
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как правильно делать, вернуть null или выбросить исключение?
например здесь

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

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

потому что если ты ждешь из функции объект Book, и будешь возвращать null, то при обращении к book.Id у тебя в runtime вылетит ошибка. ее тяжело отловить. если еще и другие люди по проекту работают, то к проблемам такой подход приведет.
можно результат операции возвращать успешно нашли или нет, или паттерном Пустой объект воспользоваться.
возвращать объект Book, но в нем завести какой то признак, который обозначает что объект пустой. потом написать функцию IsEmptyObject, которая на book.IsEmptyObject() вернет true когда объект в базе найден не был
...
Рейтинг: 0 / 0
Null VS Exception
    #39986658
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант можно использовать следующую обертку, которой пользуюсь для ответа из 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
Null VS Exception
    #39986683
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
listtoview
Почему?
например это поиск
если ничего не найдено, зачем возвращать объект? логичнее вернуть ничего
Но ты же привел другой пример.
Вот смотри. Допустим ты хочешь получить объект по id, при этом по твоей бизнес-логике объекты никогда не удаляются из этой таблицы. Таким образом, если id получен валидным путем, то он должен быть валидным и объект обязан быть найден. Если не найден, то это действительно исключение (например злой хакер ручками подменил id в запросе), ты такую ситуацию не ожидаешь.

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

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

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


Именно этот код должен вернуть null, а не падать.
...
Рейтинг: 0 / 0
Null VS Exception
    #39986728
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можешь еще вот этот срач почитать
Исключения vs коды возвратов
там немножко про другое, ну так, для погружения в вопрос )))
...
Рейтинг: 0 / 0
Null VS Exception
    #39986736
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
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
Null VS Exception
    #39986738
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes
Ты что, белены объелся? :) это же не SingleOrDefault
Дима имел ввиду не реализацию, а подход
Данная реализация понятно, что исключение выдаст )
...
Рейтинг: 0 / 0
Null VS Exception
    #39986742
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И в продолжение - в данный коде действительно не стоит выбрасывать исключение, потому что это исключением смешается с возможными исключениями от БД (например транспортного уровня или блокировки), и потом придется эти исключения где-то выше разделять на причины.
...
Рейтинг: 0 / 0
Null VS Exception
    #39986813
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
listtoview,

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



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

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


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

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


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

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

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

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

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

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

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

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

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




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

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

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


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

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


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