бросить исключение в цель-с / какао

Если вам нужно присоединиться и фильтровать что-то, что можно сделать за пределами соединения. Фильтр можно сделать после создания коллекции.

В этом случае, если я это сделаю в условии соединения, я уменьшу возвращаемые строки.

Используется тернарное условие (= n == null ? "__" : n.MonDayNote,)

  • Если объект null (поэтому нет совпадений), верните то, что после ?. __, в этом случае.
  • Else, верните то, что после :, n.MonDayNote.

Спасибо другим участникам, где я начал с моей собственной проблемы.


        var schedLocations = (from f in db.RAMS_REVENUE_LOCATIONS
              join n in db.RAMS_LOCATION_PLANNED_MANNING on f.revenueCenterID equals

                  n.revenueCenterID into lm

              from n in lm.DefaultIfEmpty()

              join r in db.RAMS_LOCATION_SCHED_NOTE on f.revenueCenterID equals r.revenueCenterID
              into locnotes

              from r in locnotes.DefaultIfEmpty()
              where f.LocID == nLocID && f.In_Use == true && f.revenueCenterID > 1000

              orderby f.Areano ascending, f.Locname ascending
              select new
              {
                  Facname = f.Locname,
                  f.Areano,
                  f.revenueCenterID,
                  f.Locabbrev,

                  //  MonNote = n == null ? "__" : n.MonDayNote,
                  MonNote = n == null ? "__" : n.MonDayNote,
                  TueNote = n == null ? "__" : n.TueDayNote,
                  WedNote = n == null ? "__" : n.WedDayNote,
                  ThuNote = n == null ? "__" : n.ThuDayNote,

                  FriNote = n == null ? "__" : n.FriDayNote,
                  SatNote = n == null ? "__" : n.SatDayNote,
                  SunNote = n == null ? "__" : n.SunDayNote,
                  MonEmpNbr = n == null ? 0 : n.MonEmpNbr,
                  TueEmpNbr = n == null ? 0 : n.TueEmpNbr,
                  WedEmpNbr = n == null ? 0 : n.WedEmpNbr,
                  ThuEmpNbr = n == null ? 0 : n.ThuEmpNbr,
                  FriEmpNbr = n == null ? 0 : n.FriEmpNbr,
                  SatEmpNbr = n == null ? 0 : n.SatEmpNbr,
                  SunEmpNbr = n == null ? 0 : n.SunEmpNbr,
                  SchedMondayDate = n == null ? dMon : n.MondaySchedDate,
                  LocNotes = r == null ? "Notes: N/A" : r.LocationNote

              }).ToList();
                Func<int, string> LambdaManning = (x) => { return x == 0 ? "" : "Manning:" + x.ToString(); };
        DataTable dt_ScheduleMaster = PsuedoSchedule.Tables["ScheduleMasterWithNotes"];
        var schedLocations2 = schedLocations.Where(x => x.SchedMondayDate == dMon);
409
задан Pramod More 31 May 2018 в 07:49
поделиться

7 ответов

Я использую [NSException raise:format:] следующим образом:

[NSException raise:@"Invalid foo value" format:@"foo of %d is invalid", foo];
523
ответ дан cwharris 31 May 2018 в 17:49
поделиться
  • 1
    Интересно, как это работает без AS ключевое слово в операторе SELECT? – diEcho 9 May 2013 в 16:45
@throw([NSException exceptionWith…])
60
ответ дан Peter Hosey 31 May 2018 в 17:49
поделиться

Я думаю, чтобы быть последовательным, более хорошо использовать @throw с Вашим собственным классом, который расширяет NSException. Затем Вы используете те же нотации для выгоды попытки наконец:

@try {
.....
}
@catch{
...
}
@finally{
...
}

Apple объясняет здесь, как бросить и обработать исключения: Захватывающие Исключения Выдающий исключения

15
ответ дан rustyshelf 31 May 2018 в 17:49
поделиться

Предостережение здесь. В Objective C, в отличие от многих подобных языков, обычно необходимо стараться не использовать исключения для ситуаций с распространенной ошибкой, которые могут произойти в нормальном функционировании.

документация Apple для Obj-C 2.0 указывает следующее: "Важный: Исключения являются ресурсоемкими в Objective C. Вы не должны использовать исключения для общего управления потоком, или просто показать ошибки (такие как файл, не являющийся доступным)"

, концептуальная документация Обработки исключений Apple объясняет то же, но с большим количеством слов: "Важный: необходимо зарезервировать использование исключений для программных ошибок или непредвиденных ошибок выполнения такой как за пределы доступ набора, попытки видоизменить неизменные объекты, отправив недопустимое сообщение, и теряя соединение с сервером окна. Вы обычно заботитесь об этих видах ошибок за исключениями, когда приложение создается, а не во времени выполнения. [.....] Вместо исключений, ошибочные объекты (NSError) и механизм ошибочной доставки Какао являются рекомендуемым способом передать ожидаемые погрешности в приложениях Какао".

причины этого состоят в том, чтобы частично придерживаться программирования идиом в Objective C (использующий возвращаемые значения в простых случаях и параметрами ссылки (часто класс NSError) в более сложных случаях), частично тот бросок и ловля исключений являются намного более дорогими и наконец (и perpaps самое главное), что исключениями Objective C является тонкая обертка вокруг C setjmp () и longjmp (), функции, по существу портя Вашу тщательную обработку памяти, видят это объяснение .

256
ответ дан Ben Lings 31 May 2018 в 17:49
поделиться

У меня нет представителя, который бы прокомментировал ответ eJames, так что, думаю, мне нужно поместить сюда свой. Тем, кто работает с Java, вы должны помнить, что Java различает Exception и RuntimeException. Exception - это отмеченное исключение, а RuntimeException не отмечено. В частности, Java предлагает использовать проверенные исключения для «нормальных условий ошибки» и непроверенные исключения для «ошибок времени выполнения, вызванных ошибкой программиста». Кажется, что исключения Objective-C следует использовать в тех же местах, где вы бы использовали непроверенное исключение, а возвращаемые значения кода ошибки или значения NSError предпочтительнее там, где вы бы использовали проверенное исключение.

33
ответ дан 22 November 2019 в 23:30
поделиться

Я считаю, что вы никогда не должны использовать Исключения для управления нормальным потоком программы. Но исключения должны выдаваться всякий раз, когда какое-либо значение не соответствует желаемому.

Например, если какая-то функция принимает значение, и это значение никогда не может быть нулевым, тогда можно выбросить исключение, а не пытаться сделать что-то "умное" ...

Рис

3
ответ дан 22 November 2019 в 23:30
поделиться

Начиная с ObjC 2.0, исключения Objective-C больше не являются оболочкой для C setjmp () longjmp () и совместимы с исключениями C ++, @try является «бесплатным», но генерирование и перехват исключений намного дороже.

В любом случае утверждения (с использованием семейства макросов NSAssert и NSCAssert) генерируют NSException, и это разумно использовать их как состояния Райса.

14
ответ дан 22 November 2019 в 23:30
поделиться