好了,到了相对轻松的话题,也是所有语言无可避免的话题:异常的处理。

我们知道对于一些常见的语言,“异常”是逃不开避不掉的主题:C中相对原始的signal或依赖系统异常支持(比如windows),C++和C#以及java中完善的内置语法,还有ruby中灵活的动态方式,在这里我们看到的是和java类似的obj-c的方法:

#import <Foundation/Foundation.h>

int main(int argc,char *argv[])
{
	@autoreleasepool{
		NSLog(@"hello obj-c!");

		int i = 0,j = 100;

		@try{
			i = j / i;
			NSLog(@"Do you see me???");
		}
		@catch(NSException *e){
			NSLog(@"caught %@:%@",[e name],[e reason]);
		}
	}
	return 0;
}

我们还可以用@throw抛出自己的异常:

#import <Foundation/Foundation.h>

@interface MyError:NSException
@end

@implementation MyError
	-(NSString*)name{
		return @"My ERROR!NEVER!";
}
	-(NSString*)reason{
		return @"NO REASON!";
	}
@end

int main(int argc,char *argv[])
{
	@autoreleasepool{
		NSLog(@"hello obj-c!");

		MyError *mye = [[MyError alloc] init];

		int i = 0,j = 100;

		@try{
			@throw mye;
			i = j / i;
			NSLog(@"Do you see me???");
		}
		@catch(NSException *e){
			NSLog(@"caught %@:%@",[e name],[e reason]);
		}
	}
	return 0;
}

apple@kissAir: objc_src$./3

2014-06-30 11:05:40.389 3[1280:507] hello obj-c!

2014-06-30 11:05:40.391 3[1280:507] *** Terminating app due to uncaught exception of class 'nil'

libc++abi.dylib: terminating with uncaught exception of type nil

Abort trap: 6


呀!执行咋错了呢?只能用NSException类吗?原因不明啊:

#import <Foundation/Foundation.h>

@interface MyError:NSException
@end

@implementation MyError
	-(NSString*)name{
		return @"My ERROR!NEVER!";
}
	-(NSString*)reason{
		return @"NO REASON!";
	}
@end

int main(int argc,char *argv[])
{
	@autoreleasepool{
		NSLog(@"hello obj-c!");

		//MyError *mye = [[MyError alloc] init];

		int i = 0,j = 100;

		@try{
			@throw [NSException exceptionWithName: @"MyERROR" \
				reason: @"NoREASON!" userInfo: nil]3;
			i = j / i;
			NSLog(@"Do you see me???");
		}
		@catch(NSException *e){
			NSLog(@"caught %@:%@",[e name],[e reason]);
		}
	}
	return 0;
}

最后介绍一下@finally的语法,@finally类似于java中的finally或者ruby中的ensure语句,表示无论发生啥都必须执行的代码,常常用在确保资源释放的场所:

int main(int argc,char *argv[])
{
	@autoreleasepool{
		NSLog(@"hello obj-c!");

		//MyError *mye = [[MyError alloc] init];

		int i = 0,j = 100;

		@try{
			@throw [NSException exceptionWithName: @"MyERROR" \
				reason: @"NoREASON!" userInfo: nil];
			i = j / i;
			NSLog(@"Do you see me???");
		}
		@catch(NSException *e){
			NSLog(@"caught %@:%@",[e name],[e reason]);
		}
		@finally{
			NSLog(@"in finally,you must see me!!!");
		}
	}
	return 0;
}

apple@kissAir: objc_src$clang -fobjc-arc -framework Foundation 3.m -o 3

apple@kissAir: objc_src$./3

2014-06-30 11:09:34.263 3[1304:507] hello obj-c!

2014-06-30 11:09:34.265 3[1304:507] caught MyERROR:NoREASON!

2014-06-30 11:09:34.265 3[1304:507] in finally,you must see me!!!

obj-c编程07:异常处理的更多相关文章

  1. 简学Python第六章__class面向对象编程与异常处理

    Python第六章__class面向对象编程与异常处理 欢迎加入Linux_Python学习群  群号:478616847 目录: 面向对象的程序设计 类和对象 封装 继承与派生 多态与多态性 特性p ...

  2. python面向对象07/异常处理

    python面向对象07/异常处理 目录 python面向对象07/异常处理 1. 异常错误分类 2. 什么是异常? 3. 异常处理 4. 为什么要有异常处理 5. 异常处理的两种方式 1.if判断 ...

  3. Python3基础(6)面向对象编程、异常处理

    ---------------个人学习笔记--------------- ----------------本文作者吴疆-------------- ------点击此处链接至博客园原文------ 1 ...

  4. msp430入门编程07

    msp430中C语言的函数及实现07 msp430中C语言操作端口I/O10 msp430中C语言的模块化头文件及实现11 msp430中C语言的模块化头文件及库文件12 msp430入门学习 msp ...

  5. C++ GUI Qt4编程(07)-3.1menu

    1. C++ GUI Qt4编程第三章,添加menu菜单. 2. mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include < ...

  6. msp430项目编程07

    msp430中项目---简单计算器 1.扫描键盘工作原理 2.电路原理说明 3.代码(显示部分) 4.代码(功能实现) 5.项目总结 msp430项目编程 msp430入门学习

  7. Java并发编程(07):Fork/Join框架机制详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.Fork/Join框架 Java提供Fork/Join框架用于并行执行任务,核心的思想就是将一个大任务切分成多个小任务,然后汇总每个小任务 ...

  8. Linux高级编程--07.进程间通信

    每个进程各自有不同的用户地址空间,进程之间要交换数据必须通过在内核中开辟缓冲区,从而实现数据共享. 管道 管道是一种最基本的IPC机制,由pipe函数创建: int pipe(int filedes[ ...

  9. Linux - 简明Shell编程07 - 数组(Array)

    脚本地址 https://github.com/anliven/L-Shell/tree/master/Shell-Basics 示例脚本及注释 #!/bin/bash test0=() # 定义数组 ...

随机推荐

  1. 海量数据处理算法(top K问题)

    举例 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M.返回频数最高的100个词. 思路 首先把文件分开 针对每个文件hash遍历,统计每个词语的频率 使用堆进 ...

  2. java的四种引用类型

    java的引用分为四个等级:4种级别由高到低依次为:强引用.软引用.弱引用和虚引用. ⑴强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回 ...

  3. ROS_Kinetic_25 在ubuntu16.04使用Leap_motion并作为手势输入控制Gazebo中的机器人

    ROS_Kinetic_25 在ubuntu16.04使用Leap_motion并作为手势输入控制Gazebo中的机器人 先附上资料网址: 1.  https://developer.leapmoti ...

  4. 【安卓网络请求开源框架Volley源码解析系列】初识Volley及其基本用法

    在安卓中当涉及到网络请求时,我们通常使用的是HttpUrlConnection与HttpClient这两个类,网络请求一般是比较耗时,因此我们通常会在一个线程中来使用,但是在线程中使用这两个类时就要考 ...

  5. Oracle采购模块中的多组织访问控制(MOAC)

     1. 概述 从Release12开始启用多组织访问控制功能,将允许用户在一个单独的职责中访问一个或者多个经营单位(OU-Operation Units)的数据.这个功能允许用户在一个可共享服务的 ...

  6. 【Unity Shaders】使用Unity Render Textures实现画面特效——建立画面特效脚本系统

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

  7. 解决WebView加载本地文件乱码

    一.问题描述 这几天现场反馈一些问题,主要是文件浏览有部分文件显示乱码,像这样: 而文件本身又是用WebView加载的,出现有的文件正常有的文件不正常. 二.问题解决 webView 加载主要有:lo ...

  8. Git Bash+EGit在项目中配合使用最常用方法总结(根据场景使用)

    最近在项目中使用Git进行代码管理,之前一直用SVN进行管理,现在谈一谈Git在项目中如何与EGit插件配合使用,高效同步开发. 使用过SVN一段时间的人,初识Git一定感觉很别扭,发现会遇到各种各样 ...

  9. 不窃取用户隐私的搜索引擎: DuckDuckGo

    不窃取用户隐私的搜索引擎: DuckDuckGo https://duckduckgo.com/ 最近goggle不给力, baidu搜出来的很多都是垃圾, bing用久了很烦. 于是用上了DuckD ...

  10. 我眼中的Linux设备树(二 节点)

    二 节点(node)的表示首先说节点的表示方法,除了根节点只用一个斜杠"/"表示外,其他节点的表示形式如"node-name@unit-address".@前边 ...