2013-03-11 24 views
7

Tôi đã làm việc trên một khuôn khổ cho một số ứng dụng thực hiện ghi nhật ký đa cấp. Nó chủ yếu được sử dụng trong các ứng dụng được sử dụng trong nhà để kiểm tra truyền thông với các thiết bị khác, nhưng cũng được sử dụng trong một số ứng dụng mà chúng tôi sẽ phân phối.Có cách nào để thực thi mã sau một ngoại lệ chưa được thực hiện trong iOS không?

Có cách nào để nắm bắt ngoại lệ chưa thực hiện và thực thi nhanh mã để lưu ngoại lệ vào tệp nhật ký không? Tại thời điểm này, lớp Log chỉ đơn giản là ghi vào mỗi tệp một cách thường xuyên, xen kẽ giữa hai tệp trong trường hợp thất bại ghi, v.v. Điều này làm việc ổn, nhưng sẽ rất tuyệt nếu nó có thể thấy rằng một ngoại lệ chưa được xử lý xảy ra, viết bất kỳ nhật ký không được viết nào các mục nhập vào tệp, lưu ý rằng một ngoại lệ đã xảy ra và ghi lại chi tiết của nó và sau đó cho phép ứng dụng gặp sự cố.

Nếu có một số cách để bắt unhandled ngoại lệ ứng dụng rộng, tôi sẽ nghĩ rằng nó sẽ là một cái gì đó như:

appDidReceiveUnhandledException:(NSException *)exception 
{ 
    //write log to disk 
    //append exception info to log file 
    //rethrow exception 
} 

Nếu bất cứ ai có thể cho tôi cái nhìn sâu sắc hoặc gợi ý về việc có hay không này là có thể, nó sẽ được đánh giá cao.

+1

'@try {} @catch (NSException * ex) {}' để giải cứu. Hoặc có thể một số phương pháp đang nổi lên trên 'NSException'? –

+1

Xem [NSSetUncaughtExceptionHandler] (https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Misccellaneous/Foundation_Functions/Reference/reference.html) (mặc dù nó không đáng tin cậy lắm). –

+0

Xem [tại đây] (http://stackoverflow.com/a/12268397/581994). –

Trả lời

17

Bạn có thể thêm một handler ngoại lệ unhandled ứng dụng rộng rãi trong appdelegate của bạn:

void HandleExceptions(NSException *exception) { 
    NSLog(@"The app has encountered an unhandled exception: %@", [exception debugDescription]); 
    // Save application data on crash 
} 

tham khảo nó trong appdelegate didFinishLaunchingWithOptions như:

NSSetUncaughtExceptionHandler(&HandleExceptions); 
+0

Tuyệt vời, cảm ơn! – mbuc91

3

Bạn có thể thiết lập xử lý ngoại lệ của riêng bạn bằng cách gọi NSSetUncaughtExceptionHandler()

Bạn có thể gọi điện cho bạn, bạn là ứng cử viên đại biểu

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

#ifdef DEBUG 
    NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); 
#endif 

... 

} 

Như bạn thấy bạn cần phải vượt qua một con trỏ hàm để một chức năng như thế này một:

void uncaughtExceptionHandler(NSException *exception) 
{ 
    NSLog(@"App Crash:\n%@", exception); 
    NSLog(@"Stack Trace:\n%@", [exception callStackSymbols]); 
} 
1

Bạn phải thiết lập xử lý ngoại lệ của bạn, điều này được thực hiện tốt nhất trong đại biểu ứng dụng của bạn trong applicationDidFinishLaunching, tức là :

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    NSSetUncaughtExceptionHandler(&mExceptionHandler); 
} 

- (void)mExceptionHandler(NSException *exception) { 
    NSLog(@"Exception %@", exception); 
} 
Các vấn đề liên quan