iOS 异常处理(-)

在开发过程中,经常要用到异常处理,防止 程序突然崩溃,在java,c++ 中有抛异常,和断言处理,那么在oc中 是怎么处理异常的呢?

1. NSAssert

看看ios 是怎么定义

#if !defined(_NSAssertBody)
#define NSAssert(condition, desc, ...)        do {                    __PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS     if (!(condition)) {                [[NSAssertionHandler currentHandler] handleFailureInMethod:_cmd         object:self file:[NSString stringWithUTF8String:__FILE__]             lineNumber:__LINE__ description:(desc), ##__VA_ARGS__];     }                        __PRAGMA_POP_NO_EXTRA_ARG_WARNINGS     } while(0)
#endif

具体用法:

如果condition 为假,就抛出异常

    int a = 0;
    NSAssert(a!=0,@"x must not be zero", __func__);

抛出的异常信息:

2015-11-21 19:58:47.692 AudioDemo[1928:60b] *** Assertion failure in -[GNViewController touchesBegan:withEvent:], /Users/geng/Desktop/programe/音频/AudioDemo/AudioDemo/GNViewController.m:41

2. 由于NSAssert 引用了self,所以,在block时候,会容易引起循环引用,所以一般用下面的断言

#define NSCAssert(condition, desc, ...)     do {                    __PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS     if (!(condition)) {                [[NSAssertionHandler currentHandler] handleFailureInFunction:[NSString stringWithUTF8String:__PRETTY_FUNCTION__]         file:[NSString stringWithUTF8String:__FILE__]             lineNumber:__LINE__ description:(desc), ##__VA_ARGS__];     }                        __PRAGMA_POP_NO_EXTRA_ARG_WARNINGS     } while(0)

3.throw 抛异常

    // 抛出异常
    if (num > 10 ) {
        NSException* exp = [NSException exceptionWithName:@"num > 10" reason:@"num > 10" userInfo:nil];
        @throw exp;
    }

打印结果是:

2015-11-21 20:40:33.999 ExceptionDemo[2136:60b] 4
2015-11-21 20:40:34.296 ExceptionDemo[2136:60b] 5
2015-11-21 20:40:34.775 ExceptionDemo[2136:60b] 6
2015-11-21 20:40:35.254 ExceptionDemo[2136:60b] 7
2015-11-21 20:40:35.813 ExceptionDemo[2136:60b] 8
2015-11-21 20:40:36.429 ExceptionDemo[2136:60b] 9
2015-11-21 20:40:36.983 ExceptionDemo[2136:60b] 10
2015-11-21 20:40:37.597 ExceptionDemo[2136:60b] *** Terminating app due to uncaught exception ‘num > 10‘, reason: ‘num > 10‘
*** First throw call stack:
(
    0   CoreFoundation                      0x017ec1e4 __exceptio

这里直接崩溃了,如果想不崩溃,继续执行,那么就要用到try catch了

    @try {
         [self.myBox pushIn];
    }
    @catch (NSException *exception) {
        NSLog(@"%@", exception.reason);
    }
    @finally {
        [self.myBox printNumber];
    }

这样就不会崩溃了。

时间: 2024-10-11 05:40:17

iOS 异常处理(-)的相关文章

ios异常处理

Malformed or corrupted AST file: 'Unable to load module "/Users/topbar/Library/Developer/Xcode/DerivedData/ModuleCache/3TJWGBUKOEC41/Darwin.pcm": module file out of date' fatal error: malformed or corrupted AST file: 'Unable to load module "

iOS 异常处理,将bug信息发送到开发者邮箱

1.iOS 在程序的开发中我们难免会遇到崩溃的问题.然后在用户体验的时候,我们如何来防止崩溃的发生呢,并将我们的崩溃原因发送给开发者来处理它. 来看一个例子 NSString *str = @"523"; arr = @[@"sdad", @"dwada", @"ffwwra"]; [str substringFromIndex:111]; 程序这样写的时候是绝对会崩溃的.我们如果想它不要崩溃,那么应该怎么做呢. @try {

iOS 异常处理(二)

上一篇文章,主要将开发中中,怎么预防崩溃的做法,但是在开发中,还有很多异常崩溃,当遇到这些异常的时候,我们如何解决呢 1 NSSetUncaughtExceptionHandler - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after applic

避免SIGPIPE导致的iOS应用闪退/Avoiding SIGPIPE signal crash in iOS(mach_msg_trap、SIGPIPE信号)

问题描述: 应用运行时,锁屏后再打开有一定几率闪退.通过真机调试发现程序会中断在此处: libsystem_kernel.dylib`mach_msg_trap: 解决思路: 通过这篇文章了解是进程收到 SIGPIPE  信号,该信号默认行为是终止进程. The process received a SIGPIPE . The default behaviour for this signal is to end the process. A SIGPIPE is sent to a proce

Python爬取CSDN博客文章

之前解析出问题,刚刚看到,这次仔细审查了 0 url :http://blog.csdn.net/youyou1543724847/article/details/52818339Redis一点基础的东西目录 1.基础底层数据结构 2.windows下环境搭建 3.java里连接redis数据库 4.关于认证 5.redis高级功能总结1.基础底层数据结构1.1.简单动态字符串SDS定义: ...47分钟前1 url :http://blog.csdn.net/youyou1543724847/

IOS开发之--异常处理--使用try 和 catch 来捕获错误。

一个搞java的老板问我会不会try catch  我说不会 学这么久也没听周围朋友用这个 因为苹果控制台本来就可以打印异常 特此研究一下. 1.try catch:  是捕获异常代码段   特点:对代码的实时监控  占用大量资源 2.ios中很少用到try 和catch 简单的来说,Apple虽然同时提供了错误处理(NSError)和异常处理(exception)两种机制,但是Apple更加提倡开发者使用NSError来处理程序运行中可恢复的错误.而异常被推荐用来处理不可恢复的错误. 原因有几

IOS消息机制应用实例--异常处理

IOS消息机制应用实例--异常处理 最近发现了一个在项目中常用的异常处的工具NullSafe,分析了它的实现原理,不小心发现了一个小Bug,现将其分享出来,关于这篇文章的Demo已经上传至GitHub,看完如有收获,欢迎Star,如有疑问欢迎issue,大家一起学习.在IOS开发中我们可能会遇到下面的情景:服务器给我们返回得某个字段是null,比如someValue:null,这个时候我们利用第三方工具转化之后会得到someValue = <null>,这个时候如果我们判断这个someValu

iOS开发——新特性Swift篇&amp;Swift 2.0 异常处理

Swift 2.0 异常处理 WWDC 2015 宣布了新的 Swift 2.0. 这次重大更新给 Swift 提供了新的异常处理方法.这篇文章会主要围绕这个方面进行讨论. 如何建造异常类型? 在 iOS 开发当中,我们会面对很多异常处理.在 Cocoa Touch 中我们使用 NSError 来进行异常处理.在新的 Swift 2.0 中,我们可以使用新的 ErrorType protocol. 在 Swift 中, enum 是最好的方法建立属于你自己的异常类型,你只要在你的 enum 中确

IOS捕获异常,常用的异常处理方法。

前言:在开发APP时,我们通常都会需要捕获异常,防止应用程序突然的崩溃,防止给予用户不友好的一面.其实OBJECT-C的异常处理方法和JAVA的雷同,懂JAVA的朋友一看就懂.我为什么要写这篇博文呢?因为我发现百度上的介绍方法,很多都不是我想要的,而我想要的又说得不清楚,重点是大家都是直接复制别人的代码...于是不多说,大家往下看--- 以下程序已测试并通过: 设备:IOS8模拟器中 开发工具:XCode6.1 使用@try.catch捕获异常: 以下是最简单的代码写法,其中@finally可以