obj-c编程07:异常处理
好了,到了相对轻松的话题,也是所有语言无可避免的话题:异常的处理。
我们知道对于一些常见的语言,“异常”是逃不开避不掉的主题: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:异常处理的更多相关文章
- 简学Python第六章__class面向对象编程与异常处理
Python第六章__class面向对象编程与异常处理 欢迎加入Linux_Python学习群 群号:478616847 目录: 面向对象的程序设计 类和对象 封装 继承与派生 多态与多态性 特性p ...
- python面向对象07/异常处理
python面向对象07/异常处理 目录 python面向对象07/异常处理 1. 异常错误分类 2. 什么是异常? 3. 异常处理 4. 为什么要有异常处理 5. 异常处理的两种方式 1.if判断 ...
- Python3基础(6)面向对象编程、异常处理
---------------个人学习笔记--------------- ----------------本文作者吴疆-------------- ------点击此处链接至博客园原文------ 1 ...
- msp430入门编程07
msp430中C语言的函数及实现07 msp430中C语言操作端口I/O10 msp430中C语言的模块化头文件及实现11 msp430中C语言的模块化头文件及库文件12 msp430入门学习 msp ...
- C++ GUI Qt4编程(07)-3.1menu
1. C++ GUI Qt4编程第三章,添加menu菜单. 2. mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include < ...
- msp430项目编程07
msp430中项目---简单计算器 1.扫描键盘工作原理 2.电路原理说明 3.代码(显示部分) 4.代码(功能实现) 5.项目总结 msp430项目编程 msp430入门学习
- Java并发编程(07):Fork/Join框架机制详解
本文源码:GitHub·点这里 || GitEE·点这里 一.Fork/Join框架 Java提供Fork/Join框架用于并行执行任务,核心的思想就是将一个大任务切分成多个小任务,然后汇总每个小任务 ...
- Linux高级编程--07.进程间通信
每个进程各自有不同的用户地址空间,进程之间要交换数据必须通过在内核中开辟缓冲区,从而实现数据共享. 管道 管道是一种最基本的IPC机制,由pipe函数创建: int pipe(int filedes[ ...
- Linux - 简明Shell编程07 - 数组(Array)
脚本地址 https://github.com/anliven/L-Shell/tree/master/Shell-Basics 示例脚本及注释 #!/bin/bash test0=() # 定义数组 ...
随机推荐
- velocity map list 数组操作
Velocity生成模板的时候,经常需要使用到map.list对象,然后遍历输出对象的属性值.当你需要遍历的时候记录遍历的步长的时候,可以使用$velocityCount内置变量进行输出.下面demo ...
- 剑指offer面试题3 二维数组中的查找 (java)
注:java主要可以利用字符串的length方法求出长度解决这个问题带来方便 public class FindNum { public static void main(String[] args) ...
- 02_3中方式的反射,通过Class.forName获得Class对象,通过类.class获得字节码对象,通过类实例.getClass()的方式获得Class对象
反射中加载类: Java中有一个Class类用于代表某一个类的字节码 .class文件 对应Class //1 加载类 // java中Class代表一个类,但是到底代表哪个类要明确指出 ...
- pig里面没有if:不能判断一个条件后决定一个执行步骤
pig是处理流 的工具,所以数据集是流对象,处理步骤也是一样的. Pig中存在按条件处理流对象的方式有 1)filter X= FILTER A BY (f1 == 8); 2)CASE WHEN T ...
- 一个简单程序快速入门JDBC
首先创建jdbc的库,再在这个库里面创建一张users表. drop database if exists jdbc; create database if not exists jdbc; use ...
- Beanstalkd 一个高性能分布式内存队列系统
需要一个分布式内存队列,能支持这些特性:任务不重不漏的分发给消费者(最基础的).分布式多点部署.任务持久化.批量处理.错误重试..... 转载:http://rdc.taobao.com/blog/c ...
- Freemarker中如何遍历List
Freemarker中如何遍历List(附源码) 关键词(Keyword):Freemarker,Freemarker遍历list 在Freemarker应用中经常会遍历List获取需要的数据, ...
- UNIX环境高级编程——创建与打开IPC通道
创建或打开一个IPC对象的三个getXXX函数的第一个参数key是类型为key_t的IPC键,返回值identifier是一个整数标识符.该标识符不同于ftok函数的id参数.对于key值,应用程序有 ...
- UNIX环境高级编程——进程间通信概念
进程间通信 --- IPC1. 进程间通信的目的a. 数据传输: 一个进程需要将他的数据发送给另一个进程b. 资源共享: 多个进程之间共享同样的资源c. 通知事件: 一个进程需要向另一个或一组进程发送 ...
- JDK6和JDK7中String的substring()方法及其差异
翻译人员: 铁锚 翻译日期: 2013年11月2日 原文链接: The substring() Method in JDK 6 and JDK 7 在JDK6与JDK7这两个版本中,substri ...