|
Исключения vs коды возвратов
|
|||
---|---|---|---|
#18+
skyANA, Хрен знает. Я вот как пользователь столкнулся с фактом. Проводить всякие тесты на локализацию проблемы желания не было. Я к тому, что это последнее время стало общим местом, и чем дальше - тем хуже. Тут купил новый бук с Win10 - вообще охреневаю от невменяемости диагностических сообщений. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 07:06 |
|
Исключения vs коды возвратов
|
|||
---|---|---|---|
#18+
Shocker.ProАлексей КЗачем их обрабатывать? Их надо логировать , по возможности где-то в одном месте. А обрабатывать, обычно, только с целью добавления диагностической информации .То есть пользователю причину знать необязательно? )) Еще раз - такие проблемы как а) кончилось место на диске б) файл с таким именем уже существуетЯ как раз и написал про добавление диагностической информации. См. красный текст и пример кода. Shocker.Proвместо выдачи какого-то сообщения для пользователя привели к введению приложения в ступор. Ну и какие логи должен смотреть рядовой пользователь?MessageBox на экране для пользователя я рассматриваю как один из вариантов логирования. Если такой подход кажется слишком необычным, то я не настаиваю, можно обозвать отображение MessageBox другим словом. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 07:12 |
|
Исключения vs коды возвратов
|
|||
---|---|---|---|
#18+
Shocker.ProТо есть пользователю причину знать необязательно? )) Ты забыл или не знал что причины делятся на уровни. Некоторые надо. А некоторые не надо т.к. нужен только Факт. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 07:29 |
|
Исключения vs коды возвратов
|
|||
---|---|---|---|
#18+
Petro123Ты забыл или не знал что причины делятся на уровни.По моему опыту, исключения делятся на две больших категории - внутренние ошибки программы, тогда пользователю выдается типа "что-то сломалось", "отправить проблему разработчику" и т.п. - пользовательские, когда пользователю показывается вменяемое или относительно вменяемое сообщение "сервер недоступен (с кнопочкой "подробнее")", "ошибка записи файла (а лучше с расшифровкой)" и т.п., предполагается, что пользователь может попытаться сам исправить проблему. К сожалению, это мало кто стал делать, в современных программах. Хотя еще лет десять назад я видел по косвенным признакам, что разрабы делали такое разделение ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 07:37 |
|
Исключения vs коды возвратов
|
|||
---|---|---|---|
#18+
Shocker.Pro, Да. Только сейчас произошла катастрофа. Пришел веб. А там правила другие. Большинство исключений не стало нужно выводить юзверю. Ну, зацепило и десктоп. И операционки. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 07:59 |
|
Исключения vs коды возвратов
|
|||
---|---|---|---|
#18+
skyANAна практике код не кишит if...else, нет шквала проверок так как действительно мало, что можешь сделать, да и не требуется Ну это понятно, что на практике вызовов мало, что это проблемы не вызывает. Для наших микро-сервисов мы используем Swagger и AutoRest, который генерит низкоуровневый API клиент, т.е. именно OperationResult. Его использовать напрямую неудобно. Даже если вызовов мало, это требует большего контроля со стороны разработчиков, поэтому пишутся высокоуровневые обёртки, которые во-первых убирают прямую зависимоть от конкретного генератора, и скрывают подробности реализации. Потребители не знают, что там, REST, SOAP или что-то ещё. По личному опыту, так получается лучше, чище, и удобней. При ошибках бросаются исключения, они документируются, решарпер подсказывает, что здесь может быть ошибка, контракты работают хорошо. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 08:02 |
|
Исключения vs коды возвратов
|
|||
---|---|---|---|
#18+
Shocker.ProskyANA, Хрен знает. Я вот как пользователь столкнулся с фактом. Проводить всякие тесты на локализацию проблемы желания не было. Я к тому, что это последнее время стало общим местом, и чем дальше - тем хуже. Тут купил новый бук с Win10 - вообще охреневаю от невменяемости диагностических сообщений. Дак давайте обратную связь вендору. Понижайте его NPS. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 08:06 |
|
Исключения vs коды возвратов
|
|||
---|---|---|---|
#18+
hVosttskyANAна практике код не кишит if...else, нет шквала проверок так как действительно мало, что можешь сделать, да и не требуется Ну это понятно, что на практике вызовов мало, что это проблемы не вызывает. Для наших микро-сервисов мы используем Swagger и AutoRest, который генерит низкоуровневый API клиент, т.е. именно OperationResult. Его использовать напрямую неудобно. Даже если вызовов мало, это требует большего контроля со стороны разработчиков, поэтому пишутся высокоуровневые обёртки, которые во-первых убирают прямую зависимоть от конкретного генератора, и скрывают подробности реализации. Потребители не знают, что там, REST, SOAP или что-то ещё. По личному опыту, так получается лучше, чище, и удобней. При ошибках бросаются исключения, они документируются, решарпер подсказывает, что здесь может быть ошибка, контракты работают хорошо. Так, давай разберём. Вот отвалился микросервис, то есть к примеру operationResult.Success - false, operationResult.StatusCode - TransportFailed, operationResult.Exception - все подробности о произошедшем И что ты будешь делать? Кидать своё исключение, куда завернёшь operationResult.Exception? При отвал отдельного микросервиса не должен приводить к отвалу системы в целом. То есть надо перехватить своё же исключение и, грубо говоря, завернуть предварительно залогировав. Не, ну можно конечно, но по мне так оверхед. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 08:17 |
|
Исключения vs коды возвратов
|
|||
---|---|---|---|
#18+
skyANAКидать своё исключение, куда завернёшь operationResult.Exception ?Да хоть в самодельное свойство, хоть в InnerException... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 08:31 |
|
Исключения vs коды возвратов
|
|||
---|---|---|---|
#18+
skyANAТо есть надо перехватить своё же исключение и, грубо говоря, завернуть предварительно залогировав.Зачем? Логирование, стандартно, организовать где-нибудь на уровне системной библиотеки, используемой для коммуникации (WebAPI, WCF и т. п.). ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 08:34 |
|
Исключения vs коды возвратов
|
|||
---|---|---|---|
#18+
skyANAВот отвалился микросервис, то есть к примеру operationResult.Success - false, operationResult.StatusCode - TransportFailed, operationResult.Exception - все подробности о произошедшем И что ты будешь делать? Ну во-первых, высокоуровневое API, может сделать что-то исходя из того, что работает с OperationResult, может попробовать ещё раз, или использовать другое подключение или что-то ещё. Потребитель высокоуровневого API ожидает, что операция будет выполнена точно также как любой вызов любого интерфейса в проекте. А если вызов не удался, по любым причинам, то сломаться должна вся цепочка, вплоть до прикладного кода, и где-то должно перехватиться исключение, чтобы вернуть систему в изначальное состояние, удалить какие-нибудь временные файлы, откатить транзакции и т.д. и т.п. Для чего потребителю знать Success или не Success? Просто я пока не понимаю, в чём профит работать с OperationResult повсеместно, а не на стыке (низкоуровневый API клиент). А также, ты предлагаешь жить теперь с двумя механизмами обработки ошибок: с исключениями и OperationResult, или уже вовсе от исключений отказываться совсем и перехватывать их везде и всегда, чтобы затолкать в свой OperationResult, привет двухтысячные, как по мне. skyANAТо есть надо перехватить своё же исключение и, грубо говоря, завернуть предварительно залогировав. Да, но отлавливать ты его можешь через множество вызовов с раскруткой стека, допустим, на уровне модуля, или приложения. И фильтровать исключения, какие ты можешь обработать по месту, а какие нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 08:35 |
|
Исключения vs коды возвратов
|
|||
---|---|---|---|
#18+
skyANAКидать своё исключение, куда завернёшь operationResult.Exception? Ну Inner-же.. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 08:35 |
|
Исключения vs коды возвратов
|
|||
---|---|---|---|
#18+
Petro123Только сейчас произошла катастрофа. Пришел веб. А там правила другие. Большинство исключений не стало нужно выводить юзверю. Ну, зацепило и десктоп. И операционки.Правила отображения ошибки зависят не от Web или неWeb , а от аудитории, использующей программу: корпоративное ПО, ПО для народных масс и т. п. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 08:40 |
|
Исключения vs коды возвратов
|
|||
---|---|---|---|
#18+
Алексей КPetro123Только сейчас произошла катастрофа. Пришел веб. А там правила другие. Большинство исключений не стало нужно выводить юзверю. Ну, зацепило и десктоп. И операционки.Правила отображения ошибки зависят не от Web или неWeb , а от аудитории, использующей программу: корпоративное ПО, ПО для народных масс и т. п. Конечно. Я указал ему только один аспект. Их много. Кстати именно веб расширил указанный тобой критерий. Раньше ПО писалось корпоративное. И ошибки райзе слались наверх к самому exe'шнику. В веб низзззяяяя). Поэтому про логирование я с вами согласен. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 08:59 |
|
Исключения vs коды возвратов
|
|||
---|---|---|---|
#18+
Алексей КskyANAКидать своё исключение, куда завернёшь operationResult.Exception ?Да хоть в самодельное свойство, хоть в InnerException... Да понятно, но зачем? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 09:44 |
|
Исключения vs коды возвратов
|
|||
---|---|---|---|
#18+
hVosttskyANAКидать своё исключение, куда завернёшь operationResult.Exception? Ну Inner-же.. Да понятно, но зачем? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 09:45 |
|
Исключения vs коды возвратов
|
|||
---|---|---|---|
#18+
Алексей КskyANAТо есть надо перехватить своё же исключение и, грубо говоря, завернуть предварительно залогировав.Зачем? Логирование, стандартно, организовать где-нибудь на уровне системной библиотеки, используемой для коммуникации (WebAPI, WCF и т. п.). Вот я и говорю: Зачем? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 09:47 |
|
Исключения vs коды возвратов
|
|||
---|---|---|---|
#18+
skyANAДа понятно, но зачем? В смысле, зачем? Давай вот такой пример. Распределённый кеш. https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.caching.distributed.idistributedcache?view=aspnetcore-2.1 Ты считаешь, что интерфейс спроектирован не лучшим образом, и методы типа Get(String) должны возвращать OperationResult, ведь очевидно, что реализация будет скорее всего использовать сетевые API, откуда будут приходить структуры, содержащие значение, статус выполнения и прочее? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 09:57 |
|
Исключения vs коды возвратов
|
|||
---|---|---|---|
#18+
hVosttskyANAВот отвалился микросервис, то есть к примеру operationResult.Success - false, operationResult.StatusCode - TransportFailed, operationResult.Exception - все подробности о произошедшем И что ты будешь делать? Ну во-первых, высокоуровневое API, может сделать что-то исходя из того, что работает с OperationResult, может попробовать ещё раз, или использовать другое подключение или что-то ещё.Хм, пишешь декораторы Circuit Breaker и Retry, при конфигурации IoC контейнера указываешь, что использовать. hVosttПотребитель высокоуровневого API ожидает, что операция будет выполнена точно также как любой вызов любого интерфейса в проекте. А если вызов не удался, по любым причинам, то сломаться должна вся цепочка, вплоть до прикладного кода, и где-то должно перехватиться исключение, чтобы вернуть систему в изначальное состояние, удалить какие-нибудь временные файлы, откатить транзакции и т.д. и т.п.Зависит от. Отвалился Couchbase, ну и фиг бы с ним, там кэш. Лезем напрямую в БД. Чуть медленнее получим данные, но зато пользователи продолжают работать. hVosttДля чего потребителю знать Success или не Success?Тупо для того, чтобы понять по какой ветке идти. В случае с кэшем для того, чтобы понять получил ты нужные данные, или надо в БД лезть. hVosttПросто я пока не понимаю, в чём профит работать с OperationResult повсеместно, а не на стыке (низкоуровневый API клиент). А также, ты предлагаешь жить теперь с двумя механизмами обработки ошибок: с исключениями и OperationResult, или уже вовсе от исключений отказываться совсем и перехватывать их везде и всегда, чтобы затолкать в свой OperationResult, привет двухтысячные, как по мне.Не не, я пока не предлагаю это делать повсеместно hVosttskyANAТо есть надо перехватить своё же исключение и, грубо говоря, завернуть предварительно залогировав. Да, но отлавливать ты его можешь через множество вызовов с раскруткой стека, допустим, на уровне модуля, или приложения. И фильтровать исключения, какие ты можешь обработать по месту, а какие нет.Опять же рассмотрим случай с кэшем. Ну зачем мне там кидать свои исключения, чтобы потом их ловить? С кэшем проблемы (operationResult не Success) - идём в БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 09:59 |
|
Исключения vs коды возвратов
|
|||
---|---|---|---|
#18+
hVosttskyANAДа понятно, но зачем? В смысле, зачем? Давай вот такой пример. Распределённый кеш. https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.caching.distributed.idistributedcache?view=aspnetcore-2.1 Ты считаешь, что интерфейс спроектирован не лучшим образом, и методы типа Get(String) должны возвращать OperationResult, ведь очевидно, что реализация будет скорее всего использовать сетевые API, откуда будут приходить структуры, содержащие значение, статус выполнения и прочее? Не, с этим всё в порядке, а вот DistributedCache.Client пусть возвращает OperationResult ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 10:02 |
|
Исключения vs коды возвратов
|
|||
---|---|---|---|
#18+
skyANAХм, пишешь декораторы Circuit Breaker и Retry, при конфигурации IoC контейнера указываешь, что использовать. Ну понятно, что "высокоуровневый клиент API", это декоратор. Таки в декораторах ты предлагаешь уже бросать исключения? skyANAЧуть медленнее получим данные, но зато пользователи продолжают работать. Верно, но это уже при декорировании. skyANAТупо для того, чтобы понять по какой ветке идти. В случае с кэшем для того, чтобы понять получил ты нужные данные, или надо в БД лезть. Это при декорировании? Или потребителю службы отдать все потроха результата выполнения? :) skyANAНе не, я пока не предлагаю это делать повсеместно ..пока?? Таки что ты имел в виду, говоря про функциональный подход в этом случае? skyANAОпять же рассмотрим случай с кэшем. Ну зачем мне там кидать свои исключения, чтобы потом их ловить? С кэшем проблемы (operationResult не Success) - идём в БД. Если ты реализуешь GetOrAdd, то потребителю не нужно будет знать вообще про то, что кеш отваливается, это зачем ему? Тем более, кеш может использовать интенсивно, а проверки результата сильно увеличивают связанность. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 10:08 |
|
Исключения vs коды возвратов
|
|||
---|---|---|---|
#18+
skyANAНе, с этим всё в порядке, а вот DistributedCache.Client пусть возвращает OperationResult Ну дык, об этом и речь. А как иначе? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 10:08 |
|
Исключения vs коды возвратов
|
|||
---|---|---|---|
#18+
hVosttskyANAНе, с этим всё в порядке, а вот DistributedCache.Client пусть возвращает OperationResult Ну дык, об этом и речь. А как иначе? О, консенсус! За это надо выпить ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 10:11 |
|
Исключения vs коды возвратов
|
|||
---|---|---|---|
#18+
hVosttТем более, кеш может использовать интенсивно, а проверки результата сильно увеличивают связанность. Вот этого не понял... Связность характеризует то, насколько хорошо все методы класса или все фрагменты метода соответствуют главной цели, - иначе говоря, насколько сфокусирован класс © Макконнелл, 2010. О чём ты? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2018, 10:14 |
|
|
start [/forum/moderation_log.php?user_name=Antonius.l]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
156ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
70ms |
get tp. blocked users: |
1ms |
others: | 544ms |
total: | 828ms |
0 / 0 |