Цель C: Создание стандартного блока try-catch для использования через приложение - PullRequest
1 голос
/ 17 июня 2011

Я создаю приложение с множеством различных частей, которые обращаются к удаленным вызовам API (как моим, так и другим).Есть много ошибок, которые могут произойти, и чтобы усугубить проблему, разные библиотеки по-разному обрабатывают эти ошибки.

По сути, я хотел бы использовать одни и те же блоки обработки ошибок для всех этих удаленных вызовов.

Это то, как я бы сделал это с Ruby, но я не уверен, как манипулировать объективом.c таким же образом

  //universal function to handle standard remote errors across errors
  def universal_handling
    begin
      yield
    rescue Exception => e
      // handle different exceptions accordingly  
      // allow crash if unexpected exception
    end
  end

  //how i would use the above block
  universal_handling{  //any of my remote call here  }

Итак, у меня есть 2 вопроса (пример кода очень важен)

  1. Как бы я написал эквивалентный код в Objective-C?Крайне важно, чтобы я мог использовать один и тот же блок обработки во всем приложении
  2. Для разработчиков iOS это хорошая практика?

Спасибо за любую оказанную помощь!Обработка ошибок может быть серьезной проблемой в заднице, поэтому я хочу получить это как можно раньше =)

Примечания:

  1. Блоки в порядке.Я не собираюсь поддерживать версии <4.2. </li>
  2. Я прочитал большинство статей там, но ни одна не отвечает, как вы можете использовать блоки для написания "оболочек" для определенного набора вызовов.

Ответы [ 2 ]

5 голосов
/ 17 июня 2011

Вы можете сделать что-то очень похожее с блоками:

typedef void(^WrappableBlock)(void);

^(WrappableBlock block) {
  @try {
    block();
  }
  @catch(...)
  }
    //handle exception
  }
}

Однако очень важно понимать, что библиотеки Cocoa (и CocoaTouch) не безопасны для исключений.Создание исключения через платформы Какао приведет к всевозможным проблемам, так как платформы не будут должным образом обрабатывать или очищать от исключений, оставляя ваше приложение в возможно несовместимом состоянии.Правильный стиль Какао должен использовать NSError и возвращать флаги, чтобы указать условия ошибки.Это не лучше и не хуже, чем использование исключений, просто другая философия.

Сделать что-то похожее на universal_handling с NSError не так уж и просто, потому что для этого потребуется, чтобы все, что вы называете, соответствовалоNSError шаблон.Тем не менее:

typedef BOOL(^WrappableBlock)(NSError**);

^(WrappableBlock block, NSError **err) {
  BOOL success = block(err);
  if(!success) {
    // handle error
  }

  return success;
}

обернет любой метод, который принимает просто NSError** и возвращает BOOL, чтобы указать наличие ошибки.Очевидно, что полезность этой обертки ограничена, так как вам придется обернуть любой интересный метод в другой блок для обработки любых других параметров.Конечно, поскольку это шаблон NSError**, вы всегда можете просто обработать ошибки, когда / где вы захотите, и передать NULL в качестве параметра NSError**, где вам все равно (игнорируя возвращаемое значение).

Последнее замечание: если вы используете библиотеки, которые могут генерировать исключения, вы должны перехватить эти исключения в рамках вызова библиотеки и обработать их.Не позволяйте исключениям распространяться, поскольку они могут затем распространяться через код структуры Какао.Таким образом, полезность предлагаемого вами блока universal_handling ограничена.

0 голосов
/ 17 июня 2011

Я бы предложил вам эту замечательную статью о коко-любви , в которой объясняется, как обрабатывать необработанные исключения в Objective-C, а также как восстанавливаться после исключения вместо "просто" сбоя.Это может быть хорошей альтернативой тому, что вы ищете.

Боюсь, что Objective-C не будет выглядеть как dynamic как ruby, то есть bit труднее сделать.

Хотелось бы также увидеть хорошую реализацию на основе блоков, если это возможно, даже если я еще не использую их из-за совместимости с предыдущей версией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...