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=() # 定义数组 ...
随机推荐
- storm消费kafka实现实时计算
大致架构 * 每个应用实例部署一个日志agent * agent实时将日志发送到kafka * storm实时计算日志 * storm计算结果保存到hbase storm消费kafka 创建实时计算项 ...
- 3.QT数据库综合案例,模糊查询等操作
1 新建一个项目: Database01.pro SOURCES += \ main.cpp \ Contact.cpp QT += gui widgets sql CONFIG += C++1 ...
- FFmpeg源代码简单分析:内存的分配和释放(av_malloc()、av_free()等)
===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...
- 基于OpenCV 的美颜相机推送直播流
程序流程: 1.图像采集 先从opencv(2.4.10版本)采集回来摄像头的图像,是一帧一帧的 每一帧图像是一个矩阵,opencv中的mat 数据结构. 2.人脸的美化 人脸美化,我们用的皮肤检测, ...
- mysql数据库连接池使用(二)实现自己的数据库连接池
上一个章节,我们讲了xml文件的解析框架XMLConfiguration的使用,不懂的可以参考 Apache Commons Configuration读取xml配置具体使用. 这个章节主要实现自己的 ...
- 一个ExtJS实例
聊聊ExtJS 这几天接触了一个项目 前台用的是extjs 发现这个东西还是有点意思的 就把前台的部分 剥离了下来 有兴趣的朋友可以当做模板学习 不多说先上效果图 这篇文章 可以看作是ext知识的一 ...
- VS2010 express中改变VC Default include/lib/… 目录
转自: Liz's Blog http://www.cnblogs.com/lizmy/archive/2012/01/10/2318258.html 2010中是以工程为单位,更改VC++ dire ...
- 安卓java.lang.IllegalArgumentException: The observer is null.解决方案
刚刚在调试自己的APP项目的时候报错java.lang.IllegalArgumentException: The observer is null.,而之前是可以运行通过,所以百思不得其解,后来在网 ...
- Tapestry: Obtained resource by @Inject is NULL
Issue: When you inject some resources by @Inject Annotation in Tapestry Page or other components, yo ...
- iOS开发之七:常用控件--UISlider、UISegmentedControl、UIPageControl的使用
一.UISlider的使用 其实UISlider在iOS开发中用的似乎不是很多,我们看到的用到的地方多是音乐播放器的音量控制,以及视频播放器中的音量控制. 还是记录一下吧! 1.常用属性 // 设置获 ...