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的修复;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,741评论 25 709
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,656评论 18 399
  • 开张新的
    一临江仙阅读 1,427评论 0 5
  • 我住在冰河世纪 到处是冰很冷很孤独 你是和煦的暖风早起的太阳 太平洋出现了裂痕落基山脉有了涓涓细流 暖风吹进 我的...
    你的Yida阅读 1,531评论 0 0
  • 最近美国很火的一首小诗: 纽约时间比加州时间早三个小时, New York is 3 hours ahead of...
    魏君NVC阅读 1,427评论 0 0

友情链接更多精彩内容