powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Null VS Exception
44 сообщений из 44, показаны все 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
Null VS Exception
    #39986907
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Кстати, возвращаясь к теме топика, на который сослались...

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


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

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


Не, всё правда. Делюсь так сказать самым что ни на есть боевым опытом.
Опыт получен, геморрой получен, профит не получен.

Всё просто.
...
Рейтинг: 0 / 0
Null VS Exception
    #39986955
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Дмитрий Мух
Спекуляция


Не, всё правда. Делюсь так сказать самым что ни на есть боевым опытом.
Опыт получен, геморрой получен, профит не получен.

Всё просто.

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


Показало себя на реальном боевом проекте как полнейшее фуфло.

А конкретней?
Почему не сделать Some|None на шарпе?
Может в стиле Go возвращать кортеж (Result, Exception) ?
...
Рейтинг: 0 / 0
Null VS Exception
    #39986966
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ
Может в стиле Go возвращать кортеж (Result, Exception) ?
https://github.com/vkhorikov/CSharpFunctionalExtensions
мы вот эту штуку впилили, немного доработав, пока не в проде, правда...
...
Рейтинг: 0 / 0
Null VS Exception
    #39987239
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
listtoview
как правильно делать, вернуть null или выбросить исключение?
например здесь

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



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

потому что если ты ждешь из функции объект Book, и будешь возвращать null, то при обращении к book.Id у тебя в runtime вылетит ошибка. ее тяжело отловить. если еще и другие люди по проекту работают, то к проблемам такой подход приведет.
можно результат операции возвращать успешно нашли или нет, или паттерном Пустой объект воспользоваться.
возвращать объект Book, но в нем завести какой то признак, который обозначает что объект пустой. потом написать функцию IsEmptyObject, которая на book.IsEmptyObject() вернет true когда объект в базе найден не был


Бредятина
...
Рейтинг: 0 / 0
Null VS Exception
    #39987245
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Зависит от того, плановая это ситуация или исключительная.
Но много зависит и от окружения - как оно построено.


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

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


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

Нормальный стиль кода
...
Рейтинг: 0 / 0
Null VS Exception
    #39987250
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
Shocker.Pro
пропущено...
Дима имел ввиду не реализацию, а подход
Данная реализация понятно, что исключение выдаст )



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

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


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

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


с**а, выкинет исключение


+146@%
...
Рейтинг: 0 / 0
Null VS Exception
    #39987367
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
просто рука не поднимается создавать объект, когда его нет
пусть даже пустой
...
Рейтинг: 0 / 0
Null VS Exception
    #39987380
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто сюда ассемблерщика пустил?
...
Рейтинг: 0 / 0
Null VS Exception
    #39987478
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA
Конкретными фактами-то не делишься, только мнением.
Чистой воды спекуляция


Почему не делюсь? Весь тот топик был про эти самые факты, о которых я говорил.
Меня убеждали, что я не прав.

Ооокеей. Я решил, что я не прав, поизучал глубже, и применил на практике.
Пол года использование в одном выделенном конкретном модуле на серьёзном большом проекте.

Как итог -- полная фигня.
Аргументы, которые я приводил, подтвердились.
Не мной лично, это фидбек от команды.
Поэтому говорить о предвзятости не приходится.
...
Рейтинг: 0 / 0
Null VS Exception
    #39987481
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ
hVostt


Показало себя на реальном боевом проекте как полнейшее фуфло.

А конкретней?
Почему не сделать Some|None на шарпе?
Может в стиле Go возвращать кортеж (Result, Exception) ?


Давай на самом простом и банальном примере, который легко экстраполируется.

Представим набор математических операций +, -, *, / как функции, которые возвращают OperationResult.
Каждая из этих операций может иметь как успех, так и ошибку.

А теперь напишите код простой логики с применением этих операций.
Посмотрим, как надолго вас хватит, и когда вы плюнете и пошлёте всех нахер с такими идеями :)

Это правда также выглядит и в других случаях.

Никакой "функциональности" в OperationResult нет, это очень сильно притянутая за уши идея, в которой нет ни смысла, ни пользы.
...
Рейтинг: 0 / 0
Null VS Exception
    #39987487
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ
Почему не сделать Some|None на шарпе?


В шарпе пока нет DU.
Можно перейти на F# и радоваться жизни, но речь шла о C#.

Конкретно для C# имеются некие костыли типа OneOf<T1, T2, T3...> и прочие, не побоюсь этого слова, убожества. Использование которых не приводит ни к чему хорошему, кроме тонны неудобоваримого, нечитаемого, плохо сопровождаемого говнокода.


ЕвгенийВ
Может в стиле Go возвращать кортеж (Result, Exception) ?


Если хочется работать в "стиле Go", то почему бы не писать на Go?

Да и стиль Go (result, error) лично я считаю плохим. Это шаг назад, высокоуровневые исключения на порядка два лучше, удобнее и безопаснее.

Но кому-то нравится.
...
Рейтинг: 0 / 0
Null VS Exception
    #39987632
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt


Если хочется работать в "стиле Go", то почему бы не писать на Go?

Да и стиль Go (result, error) лично я считаю плохим. Это шаг назад, высокоуровневые исключения на порядка два лучше, удобнее и безопаснее.

Но кому-то нравится.

Свят, свят, свят, упаси Господи меня от GO.
Действительно дряный стиль обработки ошибок, даже в их стандартной библиотеки во многих местах обработкой ошибокой пренебрегают.
...
Рейтинг: 0 / 0
Null VS Exception
    #39987634
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt

Никакой "функциональности" в OperationResult нет, это очень сильно притянутая за уши идея, в которой нет ни смысла, ни пользы.

Ну тут надо разграничивать, OperationResult должны возвращать только высокоуровневые операции, которые делают много работы и серьезно влияют на поток управления.
Так можно спуститься до проверки результатов ассемблеровской mov 😂
...
Рейтинг: 0 / 0
Null VS Exception
    #39987646
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ
hVostt

Никакой "функциональности" в OperationResult нет, это очень сильно притянутая за уши идея, в которой нет ни смысла, ни пользы.

Ну тут надо разграничивать, OperationResult должны возвращать только высокоуровневые операции, которые делают много работы и серьезно влияют на поток управления.
Так можно спуститься до проверки результатов ассемблеровской mov 😂


Там, где в этом есть конкретный обособленный смысл -- оно уже есть из коробки :)
Например, IActionResult в ASP.NET Core.
Более того, архитектурно это позволяет конвертировать экземпляр результата в HTTP ответ, с одной стороны, и тестировать контроллеры с другой.

Но потом включается работа надмозгов.. А чёбы не сделать такой супер-мега-хайлевел сервис, который будет возвращать OperationResult, который мы будем мапить в IActionResult? а? А? Крутая идея? ))

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


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