IOS开发之----异常处理

本文转载至 http://blog.csdn.net/chenyong05314/article/details/7906593

转载自:http://blog.sina.com.cn/s/blog_71715bf8010166qf.html

开篇大话:

Object-C语言的异常处理符号和C++、JAVA相似。再加上使用NSException,NSError或者自定义的类,你可以在你的应用程序里添加强大的错误处理机制。异常处理机制是由这个四个关键字支持的:@try,@catch,@thorw,@finally。当代码有可能出现异常时,我们把他放到@try语句块中。@catch()块包含了处理@try块里的抛出的异常的逻辑。无论异常是否发生,@finally块里面的语句都会执行。如果直接使用@throw块来抛出异常,这个异常本质上是一个OC的对象。咱们可以使用NSException对象,但是不局限于他们。

Objective-C的异常比较像Java的异常处理,也有@finally的处理,不管异常是否捕获都都要执行。

异常处理捕获的语法:

  • @try {
  • <#statements#>
  • }
  • @catch (NSException *exception) {
  • <#handler#>
  • }
  • @finally {
  • <#statements#>
  • }

@catch{} 块 对异常的捕获应该先细后粗,即是说先捕获特定的异常,再使用一些泛些的异常类型。

我们自定义两个异常类,看看异常异常处理的使用。

1、新建SomethingException,SomeOverException这两个类,都继承与NSException类。

SomethingException.h

  • #import <Foundation/Foundation.h>
  • @interface SomethingException : NSException
  • @end

SomethingException.m

  • #import "SomethingException.h"
  • @implementation SomethingException
  • @end

SomeOverException.h

  • #import <Foundation/Foundation.h>
  • @interface SomeOverException : NSException
  • @end

SomeOverException.m

  • #import "SomeOverException.h"
  • @implementation SomeOverException
  • @end

2、新建Box类,在某些条件下产生异常。

  • #import <Foundation/Foundation.h>
  • @interface Box : NSObject
  • {
  • NSInteger number;
  • }
  • -(void) setNumber: (NSInteger) num;
  • -(void) pushIn;
  • -(void) pullOut;
  • -(void) printNumber;
  • @end
  • @implementation Box
  • -(id) init {
  • self = [super init];
  • if ( self ) {
  • [self setNumber: 0];
  • }
  • return self;
  • }
  • -(void) setNumber: (NSInteger) num {
  • number = num;
  • if ( number > 10 ) {
  • NSException *e = [SomeOverException
  • exceptionWithName: @"BoxOverflowException"
  • reason: @"The level is above 100"
  • userInfo: nil];
  • @throw e;
  • else if ( number >= 6 ) {
  • // throw warning
  • NSException *e = [SomethingException
  • exceptionWithName: @"BoxWarningException"
  • reason: @"The level is above or at 60"
  • userInfo: nil];
  • @throw e;
  • else if ( number < 0 ) {
  • // throw exception
  • NSException *e = [NSException
  • exceptionWithName: @"BoxUnderflowException"
  • reason: @"The level is below 0"
  • userInfo: nil];
  • @throw e;
  • }
  • }
  • -(void) pushIn {
  • [self setNumber: number + 1];
  • }
  • -(void) pullOut {
  • [self setNumber: number - 1];
  • }
  • -(void) printNumber {
  • NSLog(@"Box number is: %d", number);
  • }
  • @end

这个类的作用是,初始化Box时,number数字是0,可以用pushIn 方法往Box里推入数字,每调用一次,number加1.当number数字大于等于6时产生SomethingException异常,告诉你数字达到或超过6了,超过10时产生SomeOverException异常,小于1时产生普通的NSException异常。

这里写 [SomeOverException  exceptionWithName:@"BoxOverflowException"  reason:@"The level is above 100"异常的名称和理由,在捕获时可以获取。

3、使用Box,在适当添加下捕获Box类的异常

3.1、在没超过6时,没有异常

  • - (void)viewDidLoad
  • {
  • [super viewDidLoad];
  • NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  • Box *box = [[Box alloc]init];
  • for (int i = 0; i < 5; i++) {
  • [box pushIn];
  • [box printNumber];
  • }
  • }

打印结果:

Box number is: 1

Box number is: 2

Box number is: 3

Box number is: 4

Box number is: 5

3.2 超过6,产生异常

  • for (int i = 0; i < 11; i++) {
  • [box pushIn];
  • [box printNumber];
  • }
  • 2012-07-04 09:12:05.889 ObjectiveCTest[648:f803] Box number is: 1
  • 2012-07-04 09:12:05.890 ObjectiveCTest[648:f803] Box number is: 2
  • 2012-07-04 09:12:05.890 ObjectiveCTest[648:f803] Box number is: 3
  • 2012-07-04 09:12:05.890 ObjectiveCTest[648:f803] Box number is: 4
  • 2012-07-04 09:12:05.891 ObjectiveCTest[648:f803] Box number is: 5
  • 2012-07-04 09:12:05.891 ObjectiveCTest[648:f803] *** Terminating app due to uncaught exception ‘BoxWarningException‘, reason: ‘The number is above or at 60‘

这是时,程序抛出异常崩溃了。那怎么使程序不崩溃呢,做异常处理。

3.3、加上异常处理

  • for (int i = 0; i < 11; i++) {
  • @try {
  • [box pushIn];
  • }
  • @catch (SomethingException *exception) {
  • NSLog(@"%@ %@", [exception name], [exception reason]);
  • }
  • @catch (SomeOverException *exception) {
  • NSLog(@"%@", [exception name]);
  • }
  • @finally {
  • [box printNumber];
  • }
  • }

运行,程序没有崩溃,打印结果:

  • 2012-07-04 09:14:35.165 ObjectiveCTest[688:f803] Box number is: 1
  • 2012-07-04 09:14:35.167 ObjectiveCTest[688:f803] Box number is: 2
  • 2012-07-04 09:14:35.167 ObjectiveCTest[688:f803] Box number is: 3
  • 2012-07-04 09:14:35.167 ObjectiveCTest[688:f803] Box number is: 4
  • 2012-07-04 09:14:35.167 ObjectiveCTest[688:f803] Box number is: 5
  • 2012-07-04 09:14:35.167 ObjectiveCTest[688:f803] BoxWarningException The number is above or at 60
  • 2012-07-04 09:14:35.168 ObjectiveCTest[688:f803] Box number is: 6
  • 2012-07-04 09:14:35.168 ObjectiveCTest[688:f803] BoxWarningException The number is above or at 60
  • 2012-07-04 09:14:35.168 ObjectiveCTest[688:f803] Box number is: 7
  • 2012-07-04 09:14:35.168 ObjectiveCTest[688:f803] BoxWarningException The number is above or at 60
  • 2012-07-04 09:14:35.168 ObjectiveCTest[688:f803] Box number is: 8
  • 2012-07-04 09:14:35.168 ObjectiveCTest[688:f803] BoxWarningException The number is above or at 60
  • 2012-07-04 09:14:35.169 ObjectiveCTest[688:f803] Box number is: 9
  • 2012-07-04 09:14:35.169 ObjectiveCTest[688:f803] BoxWarningException The number is above or at 60
  • 2012-07-04 09:14:35.169 ObjectiveCTest[688:f803] Box number is: 10
  • 2012-07-04 09:14:35.169 ObjectiveCTest[688:f803] BoxOverflowException
  • 2012-07-04 09:14:35.225 ObjectiveCTest[688:f803] Box number is: 11

超过10时,SomeOverException异常抛出。

3.4 、小于0时的异常

在Box类的setNumber里,当number小于0时,我们抛出普通异常。

  • @try {
  • [box setNumber:-10];
  • }
  • @catch (NSException *exception) {
  • NSLog(@"%@",[exception name]);
  • }
  • @finally {
  • [box printNumber];
  • }

打印结果:

  • 2012-07-04 09:17:42.405 ObjectiveCTest[753:f803] BoxUnderflowException
  • 2012-07-04 09:17:42.406 ObjectiveCTest[753:f803] Box number is: -10

IOS开发之----异常处理

时间: 2024-10-13 15:57:48

IOS开发之----异常处理的相关文章

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

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

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开发-线程安全-09-多线程

1 返回主页 2 GarveyCalvin 3 4 程序人生-改变未来 5 6 博客园 7 首页 8 新随笔 9 联系 10 订阅 11 管理 12 随笔- 29 文章- 29 评论- 43 13 iOS开发-多线程开发之线程安全篇 14 15 前言:一块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源,比如多个线程访问同一个对象.同一个变量.同一个文件和同一个方法等.因此当多个线程访问同一块资源时,很容易会发生数据错误及数据不安全等问题.因此要避免这些问题,我们需要使用“线程锁”来

iOS开发笔记 - 网络篇

计算机网络基础 ??计算机网络是多台独立自主的计算机互联而成的系统的总称,最初建立计算机网络的目的是实现信息传递和资源共享. ??如果说计算机是第二次世界大战的产物,那么计算机网络则是美苏冷战的产物.20世纪60年代初期,美国国防部领导的ARPA提出研究一种崭新的.能够适应现代战争的.生存性很强的通信系统并藉此来应对苏联核攻击的威胁,这个决定促使了分组交换网的诞生,也奠定今天计算机网络的原型,这是计算机网络发展史上第一个里程碑式的事件. ??第二个里程碑式的事件是20世纪80年代初,国际标准化组

iOS开发tips-神奇的UITableView

概述 UITableView是iOS开发中使用频率最高的UI控件,在前面的文章中对于UITableView的具体用法有详细的描述,今天主要看一些UITableView开发中的常见一些坑,这些坑或许不深,但是如果开发中注意不到的话往往比较浪费时间. 神奇的section header 事情的起因是一个网友说要实现一个类似下图界面,但是不管是设置sectionHeaderHeight还是代理方法中实现func tableView(_ tableView: UITableView, heightFor

iOS开发网络篇—文件的上传

iOS开发网络篇—文件的上传 说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中.本文介绍如何不借助第三方框架实现iOS开发中得文件上传. 由于过程较为复杂,因此本文只贴出部分关键代码. 主控制器的关键代码: YYViewController.m 1 #import "YYViewController.h" 2 3 #define YYEncode(str) [str dataUsingEncoding:NSUTF8StringEncoding] 4 5 @inter

iOS开发UI篇—推荐两个好用的Xcode插件(提供下载链接)

iOS开发UI篇—推荐两个好用的Xcode插件(提供下载链接) 这里推荐两款好用的Xcode插件,并提供下载链接. 一.插件和使用如下: 1.两款插件 对项目中图片提供自动提示功能的插件:KSImageNamed-Xcode-master 提供快速创建自动注释:VVDocumenter-Xcode-master 2.使用介绍: (1)KSImageNamed-Xcode-master的使用 安装该插件后,会对文件中图片进行智能提示. (2)VVDocumenter-Xcode-master能提供

IOS 开发环境,证书和授权文件等详解

一.成员介绍 1.    Certification(证书) 证书是对电脑开发资格的认证,每个开发者帐号有一套,分为两种: 1)    Developer Certification(开发证书) 安装在电脑上提供权限:开发人员通过设备进行真机测试. 可以生成副本供多台电脑安装: 2)      Distribution Certification(发布证书) 安装在电脑上提供发布iOS程序的权限:开发人员可以制做测试版和发布版的程序. 不可生成副本,仅有配置该证书的电脑才可使用:(副本制做介绍在

iOS开发之保存照片到系统相册(Photo Album)

iOS开发之保存照片到系统相册(Photo Album) 保存照片到系统相册这个功能很多社交类的APP都有的,今天我们简单讲解一下,如何将图片保存到系统相册(Photo Album). 创建UIImageView 创建UIImageView是为了将照片展示出来,我们是要把UIImage保存到系统相册(Photo Album): #define SCREEN [UIScreen mainScreen].bounds.size self.image = [UIImage imageNamed:@"i