iOS开发:错误处理、异常处理与轻量版应用设置全攻略
立即解锁
发布时间: 2025-08-25 01:34:47 阅读量: 1 订阅数: 20 


iOS开发实战:从初学者到专业开发者的指南
### iOS开发:错误处理、异常处理与轻量版应用设置全攻略
#### 1. 实现恢复选项
在iOS开发中,`NSError` 提供了一种让通知方法提供自定义恢复选项的方式。例如,当调用一个建立某种连接的方法时,如果出现超时失败,它可以提供一个“重试”选项。
`NSObject` 的 `localizedRecoveryOptions` 数组保存着调用方法定义的可用恢复选项的标题。此外,`localizedRecoverySuggestion` 属性可以用来向用户说明如何处理错误。选项标题和恢复建议都适合直接与用户沟通,比如在警告视图中。
`NSError` 恢复功能的最后一部分是 `recoveryAttempter` 属性,它引用一个符合 `NSErrorRecoveryAttempting` 非正式协议的对象,用于调用特定的恢复操作。
以下是将这些信息集成到 `handleError:fatalError:` 方法的代码:
```objc
+(void)handleError:(NSError *)error fatal:(BOOL)fatalError
{
NSString *localizedCancelTitle = NSLocalizedString(@"Dismiss", nil);
if (fatalError)
localizedCancelTitle = NSLocalizedString(@"Shut Down", nil);
// Notify the user
ErrorHandler *delegate = [[ErrorHandler alloc] initWithError:error fatal:fatalError];
if (!retainedDelegates) {
retainedDelegates = [[NSMutableArray alloc] init];
}
[retainedDelegates addObject:delegate];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[error localizedDescription]
message:[error localizedFailureReason]
delegate:delegate
cancelButtonTitle:localizedCancelTitle
otherButtonTitles:nil];
if ([error recoveryAttempter])
{
// Append the recovery suggestion to the error message
alert.message = [NSString stringWithFormat:@"%@\n%@", alert.message,
error.localizedRecoverySuggestion];
// Add buttons for the recovery options
for (NSString * option in error.localizedRecoveryOptions)
{
[alert addButtonWithTitle:option];
}
}
[alert show];
// Log to standard out
NSLog(@"Unhandled error:\n%@, %@", error, [error userInfo]);
}
```
该代码会检查是否存在 `recoveryAttempter` 对象,如果存在,则添加恢复建议和相应的按钮。
在 `alertView:clickedButtonAtIndex:` 方法中实现实际的恢复尝试,代码如下:
```objc
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex != [alertView cancelButtonIndex])
{
NSString *buttonTitle = [alertView buttonTitleAtIndex:buttonIndex];
NSInteger recoveryIndex = [[self.error localizedRecoveryOptions]
indexOfObject:buttonTitle];
if (recoveryIndex != NSNotFound)
{
if ([[self.error recoveryAttempter] attemptRecoveryFromError:self.error
optionIndex:recoveryIndex] == NO)
{
// Redisplay alert since recovery attempt failed
[ErrorHandler handleError:self.error fatal:self.fatalError];
}
}
}
else
{
// Cancel button clicked
if (self.fatalError)
{
// In case of a fatal error, abort execution
abort();
}
}
// Job is finished, release this delegate
[retainedDelegates removeObject:self];
}
```
当用户点击“重试”按钮时,会重试任务,如果再次失败则重新显示警告。
现在我们有了一个方便的默认错误处理方法,它可以从 `NSError` 对象中提取信息,并完成以下操作:
1. 提醒用户
2. 如果可用,为用户提供恢复选项
3. 将错误记录到标准错误输出
#### 2. 处理异常
在iOS中,异常通常用于不可恢复的错误。当抛出异常时,最终会导致程序终止。因此,iOS应用很少在内部捕获异常,而是让默认的异常处理方法来处理。
默认的异常处理方法会捕获任何未捕获的异常,将一些调试信息写入控制台,然后终止程序。虽然这是处理iOS异常的安全方法,但存在严重的可用性问题,因为在真实设备上无法看到控制台,应用会在用户手中直接消失,没有任何解释。
##### 2.1 异常处理策略
一般来说,在出现未捕获的异常时终止应用是一个不错的解决方案,因为它很安全,可以防止数据损坏等问题。不过,我们可以对iOS的默认异常处理进行一些改进。
首先,我们要在出现未捕获的异常时通知用户。从用户的角度来看,最好在异常发生时,也就是程序终止之前进行通知。但此时程序可能由于内存不足或指针错误等致命错误而处于不稳定状态,应避免进行用户界面编程等复杂操作。
一个好的折衷方案是记录错误,并在下次应用启动时提醒用户。为此,需要拦截未捕获的异常,并设置一个在两次会话之间持久化的标志。
##### 2.2 设置测试应用
创建一个新的单视图应用,然后在主视图中添加一个按钮,用于抛出一个假异常。实现按钮的 `throwFakeException:` 方法:
```objc
- (IBAction)throwFakeException:(id)sender
{
NSException *e = [[NSException alloc] initWithName:@"FakeException"
reason:@"The developer sucks!"
userInfo:[NSDictionary dictionaryWithObject:@"Extra info"
forKey:@"Key"]];
[e raise];
}
```
##### 2.3 拦截未捕获的异常
在iOS中拦截未捕获的异常的方法是使用 `NSSetUncaughtException` 函数注册一个处理程序。处理程序是一个只有一个 `NSException` 引用参数的 `void` 函数,示例如下:
```objc
void myExceptionHandler(NSException *exception)
{
// Handle Exceptions
}
```
实现的异常处理程序应设置一个标志,通知应用在上次运行时发生了异常。可以使用 `NSUserDefaults` 来实现会话之间的设置持久化。在 `AppDelegate.m` 文件中添加以下方法:
```objc
void exceptionHandler(NSException *exception)
{
//Set flag
NSUserDefaults *settings = [NSUserDefaults standardUserDefaults];
[settings setBool:YES forKey:@"ExceptionOccurredOnLastRun"];
[settings synchronize];
}
```
然后在 `Application recipes:didFinishLaunchingWithOptions:` 方法中注册异常处理程序:
```objc
-(BOOL)Application recipes:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSSetUncaughtExceptionHandler(&exceptionHandler);
/
```
0
0
复制全文
相关推荐










