Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 использование конструкции try catch в качестве обычного ветвления кода  [new]
yet another noob
Member

Откуда:
Сообщений: 15
Добрый день! А это нормальная практика в программировании на C# - использовать обработку исключений в качестве конструкции обычного "штатного" ветвления кода ?

Пример с гитхаба

+

using BusinessLayer;
using System;

namespace CslaFastStart
{
  class Program
  {
    static void Main(string[] args)
    {
      // ... code to create and insert a person ...

      // ... code to fetch and update a person ...

      Console.WriteLine();
      Console.WriteLine("Deleting existing person");
      Csla.DataPortal.Delete<PersonEdit>(person.Id);
      try
      {
        person = Csla.DataPortal.Fetch<PersonEdit>(person.Id);
        Console.WriteLine("Person NOT deleted");
      }
      catch
      {
        Console.WriteLine("Person successfully deleted");
      }

      Console.ReadKey();
    }
  }
}

3 фев 19, 11:21    [21800701]     Ответить | Цитировать Сообщить модератору
 Re: использование конструкции try catch в качестве обычного ветвления кода  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3408
yet another noob,

try_catch по сути своей есть ветвление, в конкретно вашем примере, как по мне, в catch обычно обрабатывают неудачу, а "удачное выполнение", выглядит как минимум странно
3 фев 19, 11:35    [21800710]     Ответить | Цитировать Сообщить модератору
 Re: использование конструкции try catch в качестве обычного ветвления кода  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1893
yet another noob
Добрый день! А это нормальная практика в программировании на C# - использовать обработку исключений в качестве конструкции обычного "штатного" ветвления кода ?

Пример с гитхаба

+

using BusinessLayer;
using System;

namespace CslaFastStart
{
  class Program
  {
    static void Main(string[] args)
    {
      // ... code to create and insert a person ...

      // ... code to fetch and update a person ...

      Console.WriteLine();
      Console.WriteLine("Deleting existing person");
      Csla.DataPortal.Delete<PersonEdit>(person.Id);
      try
      {
        person = Csla.DataPortal.Fetch<PersonEdit>(person.Id);
        Console.WriteLine("Person NOT deleted");
      }
      catch
      {
        Console.WriteLine("Person successfully deleted");
      }

      Console.ReadKey();
    }
  }
}



Да там же понятно по коду, почему так сделано.

Во первых это типа быстро накиданный пример работы с CLSA.
Во вторых внутри Fetch используется PersonDal:
namespace DataAccessLayer
{
  public class PersonDal
  {
    // this is our in-memory database
    private static List<PersonDto> _list = new List<PersonDto>();

    public PersonDto Create()
    {
      return new PersonDto { Id = -1 };
    }

    public PersonDto GetPerson(int id)
    {
      var entity = _list.FirstOrDefault(_ => _.Id == id);
      if (entity == null)
        throw new Exception("Index not found");
      return entity;
    }

И автор зачем-то решил кидать исключение на этом уровне, вместо того, чтобы вернуть null.

Соответсвенно, если возникло исключение в GetPerson после Delete, то реально "Person successfully deleted" Картинка с другого сайта.

Моё мнение: не надо так делать.
3 фев 19, 11:49    [21800712]     Ответить | Цитировать Сообщить модератору
 Re: использование конструкции try catch в качестве обычного ветвления кода  [new]
yet another noob
Member

Откуда:
Сообщений: 15
спасибо!

а что так мало отвечающих? ещё мнения будут?
3 фев 19, 15:53    [21800796]     Ответить | Цитировать Сообщить модератору
 Re: использование конструкции try catch в качестве обычного ветвления кода  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20439
Во-первых, выходной.
Во-вторых, срачи "исключения vs статус" уже порядком всем надоели, совсем недавно один из них был и уже все свои мнения высказали
3 фев 19, 15:56    [21800798]     Ответить | Цитировать Сообщить модератору
 Re: использование конструкции try catch в качестве обычного ветвления кода  [new]
hVostt
Member

Откуда:
Сообщений: 15624
yet another noob
А это нормальная практика в программировании на C# - использовать обработку исключений в качестве конструкции обычного "штатного" ветвления кода ?


Нет не нормально. Как половник или лопату вместо ложки.
3 фев 19, 17:00    [21800825]     Ответить | Цитировать Сообщить модератору
 Re: использование конструкции try catch в качестве обычного ветвления кода  [new]
hVostt
Member

Откуда:
Сообщений: 15624
Shocker.Pro,

Лично мне порядком надоели видеть в живых проектах вот эти "BusinessLayer", "BusinessLogic"... :)
Точнее, в учебных примерах, для понимания вводится DataLayer, BusinessLayer, а потом берут и тащат в свои проекты, не задумываясь.
3 фев 19, 17:03    [21800828]     Ответить | Цитировать Сообщить модератору
 Re: использование конструкции try catch в качестве обычного ветвления кода  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20439
Shocker.Pro
совсем недавно один из них был и уже все свои мнения высказали
вот же он Исключения vs коды возвратов
3 фев 19, 17:03    [21800829]     Ответить | Цитировать Сообщить модератору
 Re: использование конструкции try catch в качестве обычного ветвления кода  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3408
вам же ответили, что в рамках примера, данный код нормальный. как пример.
то есть некорректное поведение, неправильно будет в том случае, если удаленный объект можно получить, а корректным, если при получении удаленного объекта вы получите исключение. Именно это и отражает данный пример. Что тут еще объяснять? в реальной жизни такой сценарий маловероятен.
но это не значит, что возбуждение исключения для немедленного возврата управления в блок Catch в стеке вызовов это неправильно.
3 фев 19, 19:08    [21800877]     Ответить | Цитировать Сообщить модератору
 Re: использование конструкции try catch в качестве обычного ветвления кода  [new]
fkthat
Member

Откуда:
Сообщений: 1163
Код адское гамно. За такое в реальном проекте надо голову отрывать и в жоппу засовывать.
3 фев 19, 22:37    [21800936]     Ответить | Цитировать Сообщить модератору
 Re: использование конструкции try catch в качестве обычного ветвления кода  [new]
Изопропил
Member

Откуда:
Сообщений: 31186
yet another noob
спасибо!

а что так мало отвечающих? ещё мнения будут?

Код негодный
3 фев 19, 23:36    [21800957]     Ответить | Цитировать Сообщить модератору
 Re: использование конструкции try catch в качестве обычного ветвления кода  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 26531
Изопропил
yet another noob
спасибо!

а что так мало отвечающих? ещё мнения будут?

Код негодный

И противный :)
3 фев 19, 23:38    [21800959]     Ответить | Цитировать Сообщить модератору
 Re: использование конструкции try catch в качестве обычного ветвления кода  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72766
Читал рассказ про препарирование какого-то графического редактора, в котором возврат значений из функций производился через коды исключений. Автор рассказа описывал редактор как безысходно тормозное говно.

Обработка исключений - операция более медленная, чем условный переход, фу ее использовать иначе как аварийное завершение исполнения кода куска.
5 фев 19, 21:56    [21802228]     Ответить | Цитировать Сообщить модератору
 Re: использование конструкции try catch в качестве обычного ветвления кода  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Antonariy,
Названия Исключительная ситуация вполне достаточно)
5 фев 19, 23:46    [21802260]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить