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

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

  1. #import <Foundation/Foundation.h>
  2.  
  3. int main(int argc,char *argv[])
  4. {
  5. @autoreleasepool{
  6. NSLog(@"hello obj-c!");
  7.  
  8. int i = 0,j = 100;
  9.  
  10. @try{
  11. i = j / i;
  12. NSLog(@"Do you see me???");
  13. }
  14. @catch(NSException *e){
  15. NSLog(@"caught %@:%@",[e name],[e reason]);
  16. }
  17. }
  18. return 0;
  19. }

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

  1. #import <Foundation/Foundation.h>
  2.  
  3. @interface MyError:NSException
  4. @end
  5.  
  6. @implementation MyError
  7. -(NSString*)name{
  8. return @"My ERROR!NEVER!";
  9. }
  10. -(NSString*)reason{
  11. return @"NO REASON!";
  12. }
  13. @end
  14.  
  15. int main(int argc,char *argv[])
  16. {
  17. @autoreleasepool{
  18. NSLog(@"hello obj-c!");
  19.  
  20. MyError *mye = [[MyError alloc] init];
  21.  
  22. int i = 0,j = 100;
  23.  
  24. @try{
  25. @throw mye;
  26. i = j / i;
  27. NSLog(@"Do you see me???");
  28. }
  29. @catch(NSException *e){
  30. NSLog(@"caught %@:%@",[e name],[e reason]);
  31. }
  32. }
  33. return 0;
  34. }

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类吗?原因不明啊:

  1. #import <Foundation/Foundation.h>
  2.  
  3. @interface MyError:NSException
  4. @end
  5.  
  6. @implementation MyError
  7. -(NSString*)name{
  8. return @"My ERROR!NEVER!";
  9. }
  10. -(NSString*)reason{
  11. return @"NO REASON!";
  12. }
  13. @end
  14.  
  15. int main(int argc,char *argv[])
  16. {
  17. @autoreleasepool{
  18. NSLog(@"hello obj-c!");
  19.  
  20. //MyError *mye = [[MyError alloc] init];
  21.  
  22. int i = 0,j = 100;
  23.  
  24. @try{
  25. @throw [NSException exceptionWithName: @"MyERROR" \
  26. reason: @"NoREASON!" userInfo: nil]3;
  27. i = j / i;
  28. NSLog(@"Do you see me???");
  29. }
  30. @catch(NSException *e){
  31. NSLog(@"caught %@:%@",[e name],[e reason]);
  32. }
  33. }
  34. return 0;
  35. }

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

  1. int main(int argc,char *argv[])
  2. {
  3. @autoreleasepool{
  4. NSLog(@"hello obj-c!");
  5.  
  6. //MyError *mye = [[MyError alloc] init];
  7.  
  8. int i = 0,j = 100;
  9.  
  10. @try{
  11. @throw [NSException exceptionWithName: @"MyERROR" \
  12. reason: @"NoREASON!" userInfo: nil];
  13. i = j / i;
  14. NSLog(@"Do you see me???");
  15. }
  16. @catch(NSException *e){
  17. NSLog(@"caught %@:%@",[e name],[e reason]);
  18. }
  19. @finally{
  20. NSLog(@"in finally,you must see me!!!");
  21. }
  22. }
  23. return 0;
  24. }

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. Dynamics CRM 将实体从高级查找列表中移除不可见

    有时我们不需要将某个实体显示给一般用户比如配置实体,但是这种类型的实体有时候又需要给一般用户读权限ODATA的时候得能读,站点地图上的隐藏比较容易用工具配置下权限即可.其实做到这步一般就可以了但有的客 ...

  2. ROS(indigo)ABB机器人MoveIt例子

    ROS(indigo)ABB机器人例子 参考网址: 1  http://wiki.ros.org/Industrial 2  http://wiki.ros.org/abb 3  https://gi ...

  3. 开源项目——小Q聊天机器人V1.0

    小Q聊天机器人V1.0 http://blog.csdn.net/baiyuliang2013/article/details/51386281 小Q聊天机器人V1.1 http://blog.csd ...

  4. Java中类的创建及类与对象的关系

    //import java.util.Scanner; //创建一个类 class Person{ //属性和方法的定义不是必须的 //属性 String name ; int age ; //方法 ...

  5. WIP完工入库及完工退回的几个重要问题

    1.必须向CST_COMP_SNAP_INTERFACE表中插入此工单所有工序的数据(也就是说同样的工单插入多条,只是工序号不一样) 标准文档: Note: If there are multiple ...

  6. LOV里的值直接引用系统里定义的值集的值,且具有值集的安全性控制

    fnd_flex_server.check_value_security(p_security_check_mode => 'YH', p_flex_value_set_id => p_f ...

  7. javascript setinterval 正确的语法

    前几天我用setinterval 写了一个小程序,这个setinterval是用来干什么的我就不解释了. 写的方法在其它的浏览器里都能用,后来测试组的同事拿去一测就出了问题.因为她们爱用360,还有I ...

  8. iOS中 数据持久化 UI高级_17

    数据持久化的本质就是把数据由内写到本地(硬盘中),在iOS指将数据写到沙盒文件夹下: 沙盒机制:指的就是采用沙盒文件夹的形式管理应用程序的本地文件,而且沙盒文件夹的名字是随机分配的,采用十六进制方法命 ...

  9. JAVA之旅(十二)——Thread,run和start的特点,线程运行状态,获取线程对象和名称,多线程实例演示,使用Runnable接口

    JAVA之旅(十二)--Thread,run和start的特点,线程运行状态,获取线程对象和名称,多线程实例演示,使用Runnable接口 开始挑战一些难度了,线程和I/O方面的操作了,继续坚持 一. ...

  10. 手把手带你做一个超炫酷loading成功动画view Android自定义view

    写在前面: 本篇可能是手把手自定义view系列最后一篇了,实际上我也是一周前才开始真正接触自定义view,通过这一周的练习,基本上已经熟练自定义view,能够应对一般的view需要,那么就以本篇来结尾 ...