2011-03-31 13 views

cevap

16

Ben bununla devam sona erdi: (Aşağıdaki @ TommyG yorumuna dayalı)

void uncaughtExceptionHandler(NSException *exception) { 
    NSArray *backtrace = [exception callStackSymbols]; 
    NSString *platform = [[UIDevice currentDevice] platform]; 
    NSString *version = [[UIDevice currentDevice] systemVersion]; 
    NSString *message = [NSString stringWithFormat:@"Device: %@. OS: %@. Backtrace:\n%@", 
         platform, 
         version, 
         backtrace]; 

    [FlurryAPI logError:@"Uncaught" message:message exception:exception]; 
} 

GÜNCELLEME:

senin sonuna NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); ekleyin - AppDelegate içinde -(BOOL)application:didFinishLaunchingWithOptions: yöntemle. Sonra yukarıdaki yöntemi de AppDelegate'a ekleyin.

+1

Bu yöntemi nereye yerleştiriyorsunuz? Uygulama temsilcisinde mi? Bu yöntem için daha önce hiçbir prototip olmadığına dair bir uyarı alıyorum .. – TommyG

+1

@TommyG 'NSSetUncaughtExceptionHandler (& uncaughtExceptionHandler);' - (BOOL) uygulamanızın sonuna: AppDelegate uygulamasında didFinishLaunchingWithOptions: 'yöntemini ekleyin. Daha sonra yukarıdaki yöntemi AppDelegate'e de ekleyin. – alex

+1

Bu aslında size bir yığın izini veriyor mu? – jjxtra

3

Sen precompiler avantajını yapmak ve tüm değerleri toplar bir makro, örneğin yazabilirsiniz:

#define __ThrowException(name, reason, class, function, file, line, info) [NSException exceptionWithName:name reason:[NSString stringWithFormat:@"%s:%i (%@:%s) %@", file, line, class, function, reason] userInfo:info]; 
#define ThrowException(name, reason, info) __ThrowException(name, reason, [self class], _cmd, __FILE__, __LINE__, info) 

Ancak bu sadece çalışır eğer bir özel durum ve gelen zaman Bir ObjC işlevinin içinde (self ve _cmd, bir ObjC işlevinde aldığınız ilk parametrelerdir; burada öz, sınıfa işaret eden bir kimlik ve _cmd seçiciye (şu an için const!) kodlanmış olabilir) seçicidir. Yalnızca Vakfı istisnalar için bu isterseniz

Ancak, iki seçenek vardır:

    ) (@try() @catch blokları bir istisna ve yeni, özel atabilir
  1. Wrap her şey istisnai durum
  2. Yığın izini alın, bu, uygulamanızın tutarsız bir durumda mümkün olması ve tüm değerleri toplayamaması nedeniyle biraz daha zor olabilir. Geçerli yığın izinin toplanması, here'u ayrıntılı bir şekilde ele alır.
+0

Bakın, bu makroları AppDelegate içinde tanımlayabilir miyim? Eğer öyleyse, o zaman nasıl benim void uncaughtExceptionHandler (NSException * istisna) içinde kullanmaya devam eder? – fuzz

+1

@Fulvio Cusumano: Ah, makronuzun işleyicinizde kullanılmasının gerekmediği, önceden gerekli olan değerlerin önbilgisayardan alınması için bu zamana kadar geçtiğinden, istisnalar oluşturmak için kullanılmalı ve ardından bunları atmalısınız. . Dediğim gibi, yalnızca Vakıf istisnalarına ihtiyacınız varsa, yeni istisnalar oluşturmak veya yığından aşağı doğru ilerlemek için @try() ve @catch() işlevlerini kullanabilirsiniz. – JustSid

İlgili konular