Выбрасывание исключения из любого места в проекте

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

Без включения кода, который может вызывать исключение.

Каждый раз, когда возникает исключение, в главном классе отображается ошибка. От этого можно справиться?

Это обычный способ бросить исключение im using:

@try { // code that may throw exception } @catch (NSException * e) { // show alert } @finally { } 

Тем не менее, я нашел эффективную работу – создание моего собственного обработчика исключений (что также полезно по другим причинам). Сначала создайте функцию, которая будет обрабатывать ошибку и выводит ее на консоль (а также все, что вы хотите с ней делать)

  void uncaughtExceptionHandler(NSException *exception) { NSLog(@"CRASH: %@", exception); NSLog(@"Stack Trace: %@", [exception callStackSymbols]); // Internal error reporting } 

Затем добавьте обработчик исключений в ваш делегат приложения:

  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); // Normal launch stuff } 

Если это не сработает, тогда есть только две возможные причины:

Что-то переписывает ваш вызов NSSetUncaughtExceptionHandler (для всего приложения может быть только один обработчик). Например, некоторые сторонние библиотеки устанавливают свой собственный uncaughtExceptionHandler. Итак, попробуйте установить его в END вашей функции didFinishLaunchingWithOptions (или выборочно отключить сторонние библиотеки). Или еще лучше, установите символическую точку прерывания на NSSetUncaughtExceptionHandler, чтобы быстро увидеть, кто ее вызывает. Что вы можете сделать, так это изменить свой текущий, а не добавлять еще один. На самом деле вы не сталкиваетесь с исключением (например, EXC_BAD_ACCESS не является исключением)

Перейдите на панель «Точка останова» в Xcode, нажмите «плюс» в левом нижнем углу, чтобы добавить новую точку останова, затем выполните следующее:

введите описание изображения здесь

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

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

Лучший способ сделать это – использовать NSError вместо NSException . NSError обычно используется для передачи информации между различными кодовыми интерфейсами, которые ожидают возможной ошибки, где, поскольку NSException больше подходит для непредвиденных или вызванных разработчиком ошибок и, следовательно, их следует обрабатывать во время разработки.

Чтобы представить предупреждение из любого места вашего кода, вы можете добавить метод к своему делегату приложений и использовать target-action для передачи вашей ошибки. Это может выглядеть так:

 @protocol DLErrorPresentation <NSObject> - (void)showAlertWithError:(NSError*)error sender:(id)sender @end - (void)showAlertWithError:(NSError*)error sender:(id)sender { // Your alert presentation code } // In some view controller or view: NSError* error; if(![self somethingThatMayError:error]) { id<DLErrorPresentation> responder = [self targetForAction:@selector(showAlertWithError:sender:); [responder showAlertWithError:error sender:self] } 

Чтобы обеспечить дополнительный контекст, вот что говорит Apple об исключениях в своей документации:

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

Вместо исключений рекомендуется использовать объекты ошибок (NSError) и механизм доставки ошибок Cocoa – рекомендуемый способ сообщения ожидаемых ошибок в приложениях Cocoa.

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Exceptions/Exceptions.html#//apple_ref/doc/uid/10000012i

Хотя исключения во многих средах программирования обычно используются для управления потоком программирования или для обозначения ошибок, не используйте исключения таким образом в приложениях Cocoa и Cocoa Touch. Вместо этого вы должны использовать возвращаемое значение метода или функции, чтобы указать, что произошла ошибка, и предоставить информацию о проблеме в объекте ошибки.

https://developer.apple.com/library/content/documentation/General/Conceptual/DevPedia-CocoaCore/ExceptionHandling.html#//apple_ref/doc/uid/TP40008195-CH18-SW1

Я добавил код обработки исключений внутри моего main.m.

  int main(int argc, char * argv[]) { @try { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFrom Class([AppDelegate class])); } } @catch (NSException *exception) { NSLog(@"exception"); } } 

Теперь работает.

  • Проблема с лексикой или процессором: файл boost / config / user.hpp не найден
  • Тестирование приложений iPhone в iOS 3.0
  • Xcode 8.1 и iOS 10.1.1 не создают
  • Как запустить приложение для iPhone через URL-адрес Safari
  • Можете ли вы создать внутреннюю сборку TestFlight для настройки aps-environment для разработки?
  • Несколько уведомлений в одном устройстве GCM
  • Ответ AFHTTPRequestOperation nil вместо ошибки
  • Xcode не позволяет мне перетаскивать Ctrl, чтобы добавить выход
  • Как запускать автоматический отступ при фиксации в xcode
  • can not присоединяет отладчик единицы к устройству ios
  • Остановить авторотацию UIViewController во время создания
  • Давайте будем гением компьютера.