gpt4 book ai didi

ios - UIAlertView 中显示未捕获的 NSException

转载 作者:行者123 更新时间:2023-11-29 03:41:29 24 4
gpt4 key购买 nike

我使用以下方法实现了以下异常处理程序:

NSSetUncaughtExceptionHandler(&ExceptionHandler)

处理程序然后使用以下代码调用handleException:

[[AppContext alloc] init] performSelectorOnMainThread:@selector(handleException:) withObject:exception waitUntilDone:YES];

已实现如下:

NSString *message = [NSString stringWithFormat:MSG_UNHANDLED_EXCEPTION_FORMAT, exception.reason, [exception callStackSymbols]];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:TITLE_UNHANDLED_EXCEPTION message:message delegate:self cancelButtonTitle:nil otherButtonTitles:nil];

[alert show];

CFRunLoopRef runLoop = CFRunLoopGetCurrent();
CFArrayRef allModes = CFRunLoopCopyAllModes(runLoop);

while (!_quit) {
for (NSString *mode in (__bridge NSArray *)allModes) {
CFRunLoopRunInMode((__bridge CFStringRef)mode, 0.001, false);
}
}

CFRelease(allModes);

除以下情况外,此方法效果很好。我仍然可以显示 UIAlertView,但用户交互不再可用(用户无法滚动消息或点击“确定”)。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(){

// do long work on another thread...

dispatch_async(dispatch_get_main_queue(), ^(){

// updating the UI so get back on main thread...
// exception occurs in this block (example)...
@throw [NSException exceptionWithName:@"DispatchAsyncToMainThreadException" reason:@"Example" userInfo:nil];

});

注意:我实际上并没有在生产代码中抛出异常。这纯粹是为了显示未处理的异常是在哪里生成的。

当从已分派(dispatch)回主队列的 block 内引发异常时,我应该考虑到什么。

最佳答案

NSSetUncaughtExceptionHandler 的文档指出您应该在应用程序终止之前进行最后一刻的错误日志记录。此时您不应期望任何 UI 都能正常工作,而应仅将错误的详细信息记录到文件系统的某个位置。当用户再次打开应用程序时,您可以让他们知道出现了问题,并可能提供恢复/报告选项。

Discussion
Sets the top-level error-handling function where you can perform last-minute logging before the program terminates.

关于ios - UIAlertView 中显示未捕获的 NSException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18389050/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com