NSException:错误处理机制---调试中以及上架后的产品如何收集错误日志
2014-12-12 11:32
405 查看
Objective-C也有类似于java的异常处理机制---@try @catch @finally,捕获的异常是封装在NSException对象中的。
NSException中有三个重要的变量name,reason,userInfo。
NSException的用法---捕获对象不存在的异常
所有未处理的异常应该捕获,作为程序运行的反馈,所以需要一个总的处理函数,系统给我们提供了一个方法设置方法NSSetUncaughtExceptionHandler。
在AppDelegate中加入处理方法
专业的Crash统计工具
http://try.crashlytics.com
NSException中有三个重要的变量name,reason,userInfo。
//系统提供了很多异常可以直接使用 FOUNDATION_EXPORT NSString * const NSGenericException; FOUNDATION_EXPORT NSString * const NSRangeException; FOUNDATION_EXPORT NSString * const NSInvalidArgumentException; FOUNDATION_EXPORT NSString * const NSInternalInconsistencyException; FOUNDATION_EXPORT NSString * const NSMallocException; FOUNDATION_EXPORT NSString * const NSObjectInaccessibleException; FOUNDATION_EXPORT NSString * const NSObjectNotAvailableException; FOUNDATION_EXPORT NSString * const NSDestinationInvalidException; FOUNDATION_EXPORT NSString * const NSPortTimeoutException; FOUNDATION_EXPORT NSString * const NSInvalidSendPortException; FOUNDATION_EXPORT NSString * const NSInvalidReceivePortException; FOUNDATION_EXPORT NSString * const NSPortSendException; FOUNDATION_EXPORT NSString * const NSPortReceiveException; FOUNDATION_EXPORT NSString * const NSOldStyleException;也可以自定义NSException
+ (NSException *)exceptionWithName:(NSString *)name reason:(NSString *)reason userInfo:(NSDictionary *)userInfo; - (instancetype)initWithName:(NSString *)aName reason:(NSString *)aReason userInfo:(NSDictionary *)aUserInfo NS_DESIGNATED_INITIALIZER;
NSException的用法---捕获对象不存在的异常
@try { //正常的代码 } @catch (NSException *exception) { if ([[exception name] isEqualToString:NSObjectInaccessibleException]) { //如果对象不存在了 NSLog(@"Object have not exits"); //打印下 } else { [exception raise];//抛给未处理异常函数去处理 } }
所有未处理的异常应该捕获,作为程序运行的反馈,所以需要一个总的处理函数,系统给我们提供了一个方法设置方法NSSetUncaughtExceptionHandler。
在AppDelegate中加入处理方法
void UncaughtExceptionHandler(NSException *exception) { NSArray *stackSymbols = [exception callStackSymbols]; NSArray *stackReturnAddress = [exception callStackReturnAddresses]; NSString *reason = [exception reason]; NSString *name = [exception name]; NSString *url = [NSString stringWithFormat:@"=============异常崩溃报告=============\nname:\n%@\nreason:\n%@\ncallStackSymbols:\n%@\nstackReturnAddress:\n%@", name,reason,[stackSymbols componentsJoinedByString:@" "],[stackReturnAddress componentsJoinedByString:@" "]]; NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"Exception.txt"]; [url writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil]; //除了可以选择写到应用下的某个文件,通过后续处理将信息发送到服务器等 //还可以选择调用发送邮件的的程序,发送信息到指定的邮件地址 //或者调用某个处理程序来处理这个信息 }
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler); //处理函数 return YES; }
专业的Crash统计工具
http://try.crashlytics.com
相关文章推荐
- 用JQuery Ajax 与一般处理程序 请求数据无刷新,以及如何调试错误
- 如何建立用户、权限和角色,以及如何根据日志调试用户的报表权限
- __BEGIN__; __END__是opencv中的一种错误处理机制,它可以防止非法的内存释放,以及内存泄露
- ASP.NET全局错误处理和异常日志记录以及IIS配置自定义错误页面
- PHP和MySQL中如何进行错误处理与调试
- DB2数据库HANG住的时候应该收集什么数据以及如何处理
- 如何处理Global symbol * requires explicit package name编译错误,以及use strict用法
- WebAPI错误处理:如何简化调试
- 如何解决重复日志问题,谈谈错误用返回值还是用抛异常进行处理
- 产品有统一的错误处理机制和报错界面
- 函数用户PHP自学之路----错误及异常处理机制、错误日志
- 几十条业务线日志系统如何收集处理?
- rsyslog, logstash如何结合收集处理日志信息
- 利用Rsyslog集中收集系统日志和用户操作记录以及相关处理方法 推荐
- 几十条业务线日志系统如何收集处理?
- __autoload && set_hander php的错误异常处理机制以及自动加载机制
- Yii的日志的处理机制以及扩展案例
- 如何得出一段时间内日志中的错误种类以及次数
- PHP自学之路----错误及异常处理机制、错误日志
- 如何收集DS4K的错误日志