Вопрос по iphone, ios, xcode – Как узнать, когда безопасно игнорировать __cxa_throw на точке останова All Exceptions?

45

Я на Xcode 4.5.1. Я думаю, что это относительно новое поведение, которое я вижу.

Я предпочитаю разрабатывать и тестировать свои проекты сВсе исключения " Точка останова включена.

Я столкнулся со сценарием, в котором я загружаю уменьшенные изображения в ячейки в виде таблицы, где я получаю исключение __cxa_throw. Когда я нажимаюПродолжить выполнение программы " Кнопка Xcode продолжает свой веселый путь. Я получаю эскизы. Приложение работает нормально. Я ищу несколько советов о том, как определить, можно ли это игнорировать. Например, некоторые советы по пониманию трассировки стека? Или что-то другое?

Вот фрагмент кода:

    NSString *imageStr = item.thumbURL;
    imageStr = [imageStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSURL *imageURL;

    if (![imageStr isEqualToString:@""]) {
        imageURL = [NSURL URLWithString:imageStr];
        NSLog(@"imageURL: %@",imageURL);
        if (imageURL == nil) {
            NSLog(@"imageUrl was nil for string: %@",imageStr);
        } else {
            UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
            //spinner.frame = CGRectMake(cell.imageView.frame.size.width/2,cell.imageView.frame.origin.y + cell.imageView.frame.size.height/2,cell.imageView.frame.size.width,cell.imageView.frame.size.height);
            spinner.frame = CGRectMake(10,20,40,40);
            [spinner startAnimating];
            [cell addSubview:spinner];

            dispatch_queue_t downloadQueue = dispatch_queue_create("thumbnail downloader", NULL);
            dispatch_async(downloadQueue, ^{
                NSLog(@"Network request for tour_thumb image: %@",imageStr);
                UIImage *img = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:imageURL]];
                dispatch_async(dispatch_get_main_queue(), ^{
                    [spinner removeFromSuperview];
                    UIImageView *imgView=[[UIImageView alloc] initWithFrame:CGRectMake(8, 8, cell.contentView.frame.size.width/2 - 16, cell.contentView.frame.size.height - 16)];
                    imgView.image = img;
                    [cell.contentView addSubview:imgView];
                });
            });
            dispatch_release(downloadQueue);
        }
    }

Вот что я вижу на трассировке стека:

#0  0x34a9c524 in __cxa_throw ()
#1  0x387014ce in AddChildNode(XMP_Node*, XML_Node const&, char const*, bool) ()
#2  0x38700d22 in RDF_LiteralPropertyElement(XMP_Node*, XML_Node const&, bool) ()
#3  0x3870094e in RDF_PropertyElementList(XMP_Node*, XML_Node const&, bool) ()
#4  0x38700608 in ProcessRDF(XMP_Node*, XML_Node const&, unsigned int) ()
#5  0x3871480a in XMPMeta::ParseFromBuffer(char const*, unsigned int, unsigned int) ()
#6  0x387095c0 in WXMPMeta_ParseFromBuffer_1 ()
#7  0x38725578 in TXMPMeta::ParseFromBuffer(char const*, unsigned int, unsigned int) ()
#8  0x387254de in TXMPMeta::TXMPMeta(char const*, unsigned int) ()
#9  0x38722b70 in CreateMetadataFromXMPDataInternal(char const*, unsigned long, unsigned int) ()
#10 0x38739a50 in readXMPProperties ()
#11 0x386a01fc in readXMPData ()
#12 0x3868cec8 in initImageJPEG ()
#13 0x3868c2ee in _CGImagePluginInitJPEG ()
#14 0x3867e274 in makeImagePlus ()
#15 0x3867ddde in CGImageSourceCreateImageAtIndex ()
#16 0x38e117b6 in _UIImageRefFromData ()
#17 0x38e116c6 in -[UIImage initWithData:] ()
#18 0x0004cb0a in __57-[ViewController tableView:cellForRowAtIndexPath:]_block_invoke_0 at ViewController.m:335
#19 0x313fc792 in _dispatch_call_block_and_release ()
#20 0x313ffb3a in _dispatch_queue_drain ()
#21 0x313fd67c in _dispatch_queue_invoke ()
#22 0x31400612 in _dispatch_root_queue_drain ()
#23 0x314007d8 in _dispatch_worker_thread2 ()
#24 0x394767f0 in _pthread_wqthread ()
#25 0x39476684 in start_wqthread ()
Этот вопрос и ответ ниже (т. Е. Только перехват стандартных исключений Objective-C) применим также к Xcode 7.2.1 и, вероятно, к более поздним версиям. bluebinary

Ваш Ответ

2   ответа
34

Иди сюда:

И сделать это:

Чтобы включить это:

в это:

Вы'Я все еще получу большую выгоду от добавления точки останова, но выигралв вашем приложении ничего не получаетсяЯ несу ответственность за все равно. Теперь, если вы работаете с C ++, вам, черт побери, лучше об этом беспокоиться.

Полезно, спасибо. Geoffrey Wiseman
63

Это очевидно глубоко внутри реализации, и исключения C ++ могут быть частью нормального потока, если ониМы решили использовать исключения для внутреннего оповещения об ошибках.

Если ты непишите любой C ++ самостоятельноявляется безопасно игнорировать.

Просто перехватите стандартное исключение Objective C:

objc_exception_throw
Спасибо, троянфо. Я изменил точку останова, чтобы изменить "Исключение: все " к "Исключение: Objective-C ", Это имеет смысл. Del Brown
На всякий случай, кто-то достигнет этого и не знает, как это сделать :)stackoverflow.com/a/14767076/2298217 iamdavidlam

Похожие вопросы