美文网首页
iOS开发中的异常处理

iOS开发中的异常处理

作者: 华子小筑 | 来源:发表于2016-11-17 16:33 被阅读498次

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

    程序运行有可能会出现错误,一旦遇到错误时该如何处理?在实际的开发中一般有两种错误处理的方式:通过函数返回值解决错误...

  • Swift 2.0 异常处理

    如何建造异常类型? 在 iOS 开发当中,我们会面对很多异常处理。在 Cocoa Touch 中我们使用 NSEr...

  • IOS 捕获异常工具UncaughtExceptionHandl

    原文IOS 捕获异常工具UncaughtExceptionHandleriOS程序异常Crash友好化处理 开发i...

  • iOS开发--异常处理

    程序都会有bug,那么在有bug和异常时能不能给个提醒呢,今天咱们来看看这个问题怎么解决 首先说下基本的NSExc...

  • iOS 开发异常处理

    在开发APP时,我们通常都会需要捕获异常,防止应用程序突然的崩溃,防止给予用户不友好的一面。其实OBJECT-C的...

  • swift-之try-catch

    前段时间朋友打电话偶尔给我抱怨到,有人质疑为什么iOS 开发没有用try catch处理异常,自己开发在iOS开发...

  • iOS中的异常处理

  • InvocationTargetException的产生与处理

    开发中 我们 需要对 异常 进行 捕获处理。某些地方 会 对异常进行全局 拦截处理,时常遇到 的 问题是,异常"迷...

  • 文字处理

    iOS 文字处理相关转载http://ios.jobbole.com/90856/在 iOS 开发中,文字处理可以...

  • iOS开发日常异常处理记录

    转眼已经两年没有更新记录了,简书还在,真好!没错,爷还在搞iOS,真好!写个笔记,记录平时开发的错误总结,虽然有的...

网友评论

      本文标题:iOS开发中的异常处理

      本文链接:https://www.haomeiwen.com/subject/tngdpttx.html