iOS开发中的异常处理

程序运行有可能会出现错误,一旦遇到错误时该如何处理?在实际的开发中一般有两种错误处理的方式:通过函数返回值解决错误问题,另外一种是异常捕获;而后一种错误处理的方式目前被广泛的应用;那么在iOS开发中错误的处理是怎样的呢?

Objective-C的异常处理
 - (void)viewDidLoad {
   [super viewDidLoad];

    @try {
          NSArray* testArray = @[@"1"];
          NSLog(@"%@",testArray[4]);
    } @catch (NSException *exception) {
        NSLog(@"%@",exception.reason);
    } @finally {
        // 即使出现异常,仍旧去处理的事务
    }
}   
  • 上述代码块中@try...@catch代码块包裹可能出现异常的代码片段,异常处理后(日志记录等)在@finally块中可以继续执行其他事务操作;
  • 实际在使用Objective-C编程中很少会看见@try...@catch...@finally的这种处理模式;为什么很少使用异常处理?一种说法异常处理会带来性能上的损耗,另外一种说法是app开发过程中的crash是能够通过缜密的编程避免的,即使出现网络异常,文件操作失败等也不会导致闪退出现,可以通过日志系统反馈,同时Apple提供的API中也很难见到抛出异常的;
  • 知乎中详细介绍了为什么不建议使用try...catch可以仔细阅读了解一下
App崩溃前如何进行异常抓取
  • NSSetUncaughtExceptionHandler:可以在程序运行终止之前进行日志的记录
  • 错误的信息包含函数堆栈调用、出错原因等
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Sets the top-level error-handling function where you can perform last-minute logging before the program terminates.
    NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);
    return YES;
    }
    
    void UncaughtExceptionHandler(NSException *exception) {
        NSArray *callStack = [exception callStackSymbols];
        NSString *reason = [exception reason];
        NSString *name = [exception name];
        NSString *content = [NSString stringWithFormat:@"========异常错误报告========\nname:%@\nreason:\n%@\ncallStackSymbols:\n%@",name,reason,[callStack componentsJoinedByString:@"\n"]];
    }    
Swift中的错误处理
import Cocoa
enum FileManagerError:Error{
    case filePathNotExist
    case fileAuthorityForbidden
}
class FileManager: NSObject {
// 定义一个throwing函数对操作过程遇到的错误进行处理
  public  func openFile(filePath:String) throws -> Bool {
        if  !filePath.isEmpty {
           return true
        }else{
            throw FileManagerError.filePathNotExist
        }
    }
}
使用throwing函数抛出异常

上述代码中openFile函数参数列表后加了throws关键字,在函数体中出现异常信息的时候就可以通过throw将异常抛出;然后通过try?将错误转化为可选值进行处理

 // 使用try?将错误转化成可选值来进行处理
let fileManager = FileManager()
let errorMessage = try?fileManager.openFile(filePath: "/var/library")
print(errorMessage)
使用do...catch

使用do...catch处理异常信息需要catch住异常后罗列所有的异常信息后再一一进行业务处理

   // 使用 do...catch 列举所有的错误进行处理
do {
    let message =  try fileManager.openFile(filePath: "/var/library")
    print(message)
} catch FileManagerError.filePathNotExist {
    print("filePathNotExist")
}catch FileManagerError.fileAuthorityForbidden {
    print("fileAuthorityForbidden")
}catch{
    print("otherErrorMessage")
}

上述是介绍iOS开发中对于程序异常的处理;实际开发中会依赖三方服务类似:友盟错误统计、BugTags等三方服务来收集线上错误日志信息,同时目前的Apple在Xcode中也可以看到Appstore中下载App的崩溃信息,通过这些错误信息定位项目中引发问题的代码,最终完成bug的修复;

你可能感兴趣的:(iOS开发中的异常处理)