Как отловить NSInvalidArgumentException? - PullRequest
2 голосов
/ 02 марта 2011

есть ли способ его поймать?Или это ошибка?

Ответы [ 4 ]

6 голосов
/ 04 октября 2012

Итак, чтобы ответить на этот вопрос, я использовал следующее:

@try{ 
   //your code
} @catch (NSException* exception) {
   NSLog(@"Got exception: %@    Reason: %@", exception.name, exception.reason);
}

и строка NSInvalidArgumentException печатается для «имя-исключения», поэтому ясно, что можно просто проверить это имя-исключения. Для фактического типа исключения.

Не самая красивая, но работает.

5 голосов
/ 11 апреля 2011

Если я вас правильно понимаю, вы спрашиваете, почему вы не можете перехватить исключение NSInvalidArgumentsException.Чтобы быть точным, исключение не перехватывается, даже если вы пытаетесь отловить его как исключение NSException, которое всегда должно работать.Я также столкнулся с этой проблемой и после осмотра - эта проблема действительно выглядит как ошибка Apple.Пожалуйста, смотрите эту страницу .Люди сообщают, что проблема существует только на симуляторах и корректно работает на реальных устройствах.

0 голосов
/ 11 января 2019

Как упомянул @David, мы можем использовать нижеприведенный код

@try{ 
   //your code
} @catch (NSException* exception) {
   NSLog(@"Got exception: %@    Reason: %@", exception.name, exception.reason);
}

и @Moshe Kravchik, в некоторых ситуациях некоторые исключения не перехватываются, то есть в основном, когда мы отправляем новый блок в очередь, поэтому ярекомендовал бы добавить отдельный блок try catch для каждой отправки очереди.

т.е. try..catch в main () не будет перехватывать исключение, произошедшее в классе AppDelegate, поэтому необходимо добавить отдельный try..catch в AppDelegate

, например:

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
    @try{

        self.viewController = [[MainViewController alloc] init];

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            @try{
                NSLog(@"This is a block");
                NSObject * b= nil;
                [NSArray arrayWithObject:b];
            } @catch (NSException* exception) {
                NSLog(@"Got exception: %@    Reason: %@", exception.name, exception.reason);
            }
        });

        return [super application:application didFinishLaunchingWithOptions:launchOptions];
    } @catch (NSException* exception) {
        NSLog(@"Got exception: %@    Reason: %@", exception.name, exception.reason);
    }
}

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

void onUncaughtException(NSException* exception)
{
    NSLog(@"onUncaughtException : %@", exception.reason);
}

int main(int argc, char* argv[])
{
    @autoreleasepool {
        NSSetUncaughtExceptionHandler(&onUncaughtException);
        int retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate");
         return retVal;
    }
}

для сигналов, отличных от исключения, таких как неправильное использование памяти и т. Д., Мы должны прослушивать определенный сигнал

void signalHandler(int signal)
{
    NSLog(@"Got signal %d",signal);
}

    signal(SIGPIPE, &signalHandler);
    signal(SIGABRT, &signalHandler );
    signal(SIGHUP, &signalHandler );
    signal(SIGINT, &signalHandler );
    signal(SIGQUIT, &signalHandler );
    signal(SIGILL, &signalHandler );
    signal(SIGIOT, &signalHandler );
    signal(SIGFPE, &signalHandler );
    signal(SIGSEGV, &signalHandler );
    signal(SIGSYS, &signalHandler );
    signal(SIGPIPE, &signalHandler );

Подробнее о необученном исключении здесь .

0 голосов
/ 02 марта 2011

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

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