Objective-C语法之异常处理 (?)

目录 (?)

[+]

Objective-C的异常比较像Java的异常处理,也有@finally的处理,不管异常是否捕获都都要执行。
异常处理捕获的语法:
  1. @try{
  2. <#statements#>
  3. }
  4. @catch(NSException*exception){
  5. <#handler#>
  6. }
  7. @finally{
  8. <#statements#>
  9. }
@catch{} 块 对异常的捕获应该先细后粗,即是说先捕获特定的异常,再使用一些泛些的异常类型。
我们自定义两个异常类,看看异常异常处理的使用。

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

SomethingException.h
  1. #import<Foundation/Foundation.h>
  2. @interfaceSomethingException:NSException
  3. @end
SomethingException.m
  1. #import"SomethingException.h"
  2. @implementationSomethingException
  3. @end
SomeOverException.h
  1. #import<Foundation/Foundation.h>
  2. @interfaceSomeOverException:NSException
  3. @end
SomeOverException.m
  1. #import"SomeOverException.h"
  2. @implementationSomeOverException
  3. @end

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

  1. #import<Foundation/Foundation.h>
  2. @interfaceBox:NSObject
  3. {
  4. NSIntegernumber;
  5. }
  6. -(void)setNumber:(NSInteger)num;
  7. -(void)pushIn;
  8. -(void)pullOut;
  9. -(void)printNumber;
  10. @end

  1. @implementationBox
  2. -(id)init{
  3. self=[superinit];
  4. if(self){
  5. [selfsetNumber:0];
  6. }
  7. returnself;
  8. }
  9. -(void)setNumber:(NSInteger)num{
  10. number=num;
  11. if(number>10){
  12. NSException*e=[SomeOverException
  13. exceptionWithName:@"BoxOverflowException"
  14. reason:@"Thelevelisabove100"
  15. userInfo:nil];
  16. @throwe;
  17. }elseif(number>=6){
  18. //throwwarning
  19. NSException*e=[SomethingException
  20. exceptionWithName:@"BoxWarningException"
  21. reason:@"Thelevelisaboveorat60"
  22. userInfo:nil];
  23. @throwe;
  24. }elseif(number<0){
  25. //throwexception
  26. NSException*e=[NSException
  27. exceptionWithName:@"BoxUnderflowException"
  28. reason:@"Thelevelisbelow0"
  29. userInfo:nil];
  30. @throwe;
  31. }
  32. }
  33. -(void)pushIn{
  34. [selfsetNumber:number+1];
  35. }
  36. -(void)pullOut{
  37. [selfsetNumber:number-1];
  38. }
  39. -(void)printNumber{
  40. NSLog(@"Boxnumberis:%d",number);
  41. }
  42. @end
这个类的作用是,初始化Box时,number数字是0,可以用pushIn 方法往Box里推入数字,每调用一次,number加1.当number数字大于等于6时产生SomethingException异常,告诉你数字达到或超过6了,超过10时产生SomeOverException异常,小于1时产生普通的NSException异常。

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

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

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

  1. -(void)viewDidLoad
  2. {
  3. [superviewDidLoad];
  4. NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
  5. Box*box=[[Boxalloc]init];
  6. for(inti=0;i<5;i++){
  7. [boxpushIn];
  8. [boxprintNumber];
  9. }
  10. }
打印结果:

Box number is: 1

Box number is: 2

Box number is: 3

Box number is: 4

Box number is: 5

3.2 超过6,产生异常

  1. for(inti=0;i<11;i++){
  2. [boxpushIn];
  3. [boxprintNumber];
  4. }
  1. 2012-07-0409:12:05.889ObjectiveCTest[648:f803]Boxnumberis:1
  2. 2012-07-0409:12:05.890ObjectiveCTest[648:f803]Boxnumberis:2
  3. 2012-07-0409:12:05.890ObjectiveCTest[648:f803]Boxnumberis:3
  4. 2012-07-0409:12:05.890ObjectiveCTest[648:f803]Boxnumberis:4
  5. 2012-07-0409:12:05.891ObjectiveCTest[648:f803]Boxnumberis:5
  6. 2012-07-0409:12:05.891ObjectiveCTest[648:f803]***Terminatingappduetouncaughtexception'BoxWarningException',reason:'Thenumberisaboveorat60'
这是时,程序抛出异常崩溃了。那怎么使程序不崩溃呢,做异常处理。

3.3、加上异常处理

  1. for(inti=0;i<11;i++){
  2. @try{
  3. [boxpushIn];
  4. }
  5. @catch(SomethingException*exception){
  6. NSLog(@"%@%@",[exceptionname],[exceptionreason]);
  7. }
  8. @catch(SomeOverException*exception){
  9. NSLog(@"%@",[exceptionname]);
  10. }
  11. @finally{
  12. [boxprintNumber];
  13. }
  14. }
运行,程序没有崩溃,打印结果:
  1. 2012-07-0409:14:35.165ObjectiveCTest[688:f803]Boxnumberis:1
  2. 2012-07-0409:14:35.167ObjectiveCTest[688:f803]Boxnumberis:2
  3. 2012-07-0409:14:35.167ObjectiveCTest[688:f803]Boxnumberis:3
  4. 2012-07-0409:14:35.167ObjectiveCTest[688:f803]Boxnumberis:4
  5. 2012-07-0409:14:35.167ObjectiveCTest[688:f803]Boxnumberis:5
  6. 2012-07-0409:14:35.167ObjectiveCTest[688:f803]BoxWarningExceptionThenumberisaboveorat60
  7. 2012-07-0409:14:35.168ObjectiveCTest[688:f803]Boxnumberis:6
  8. 2012-07-0409:14:35.168ObjectiveCTest[688:f803]BoxWarningExceptionThenumberisaboveorat60
  9. 2012-07-0409:14:35.168ObjectiveCTest[688:f803]Boxnumberis:7
  10. 2012-07-0409:14:35.168ObjectiveCTest[688:f803]BoxWarningExceptionThenumberisaboveorat60
  11. 2012-07-0409:14:35.168ObjectiveCTest[688:f803]Boxnumberis:8
  12. 2012-07-0409:14:35.168ObjectiveCTest[688:f803]BoxWarningExceptionThenumberisaboveorat60
  13. 2012-07-0409:14:35.169ObjectiveCTest[688:f803]Boxnumberis:9
  14. 2012-07-0409:14:35.169ObjectiveCTest[688:f803]BoxWarningExceptionThenumberisaboveorat60
  15. 2012-07-0409:14:35.169ObjectiveCTest[688:f803]Boxnumberis:10
  16. 2012-07-0409:14:35.169ObjectiveCTest[688:f803]BoxOverflowException
  17. 2012-07-0409:14:35.225ObjectiveCTest[688:f803]Boxnumberis:11
超过10时,SomeOverException异常抛出。

3.4 、小于0时的异常

在Box类的setNumber里,当number小于0时,我们抛出普通异常。
  1. @try{
  2. [boxsetNumber:-10];
  3. }
  4. @catch(NSException*exception){
  5. NSLog(@"%@",[exceptionname]);
  6. }
  7. @finally{
  8. [boxprintNumber];
  9. }
打印结果:
  1. 2012-07-0409:17:42.405ObjectiveCTest[753:f803]BoxUnderflowException
  2. 2012-07-0409:17:42.406ObjectiveCTest[753:f803]Boxnumberis:-10

著作权声明:本文由http://blog.csdn.net/totogo2010/原创,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢!

Objective-C的异常比较像Java的异常处理,也有@finally的处理,不管异常是否捕获都都要执行。
异常处理捕获的语法:
  1. @try{
  2. <#statements#>
  3. }
  4. @catch(NSException*exception){
  5. <#handler#>
  6. }
  7. @finally{
  8. <#statements#>
  9. }
@catch{} 块 对异常的捕获应该先细后粗,即是说先捕获特定的异常,再使用一些泛些的异常类型。
我们自定义两个异常类,看看异常异常处理的使用。

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

SomethingException.h
  1. #import<Foundation/Foundation.h>
  2. @interfaceSomethingException:NSException
  3. @end
SomethingException.m
  1. #import"SomethingException.h"
  2. @implementationSomethingException
  3. @end
SomeOverException.h
  1. #import<Foundation/Foundation.h>
  2. @interfaceSomeOverException:NSException
  3. @end
SomeOverException.m
  1. #import"SomeOverException.h"
  2. @implementationSomeOverException
  3. @end

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

  1. #import<Foundation/Foundation.h>
  2. @interfaceBox:NSObject
  3. {
  4. NSIntegernumber;
  5. }
  6. -(void)setNumber:(NSInteger)num;
  7. -(void)pushIn;
  8. -(void)pullOut;
  9. -(void)printNumber;
  10. @end

  1. @implementationBox
  2. -(id)init{
  3. self=[superinit];
  4. if(self){
  5. [selfsetNumber:0];
  6. }
  7. returnself;
  8. }
  9. -(void)setNumber:(NSInteger)num{
  10. number=num;
  11. if(number>10){
  12. NSException*e=[SomeOverException
  13. exceptionWithName:@"BoxOverflowException"
  14. reason:@"Thelevelisabove100"
  15. userInfo:nil];
  16. @throwe;
  17. }elseif(number>=6){
  18. //throwwarning
  19. NSException*e=[SomethingException
  20. exceptionWithName:@"BoxWarningException"
  21. reason:@"Thelevelisaboveorat60"
  22. userInfo:nil];
  23. @throwe;
  24. }elseif(number<0){
  25. //throwexception
  26. NSException*e=[NSException
  27. exceptionWithName:@"BoxUnderflowException"
  28. reason:@"Thelevelisbelow0"
  29. userInfo:nil];
  30. @throwe;
  31. }
  32. }
  33. -(void)pushIn{
  34. [selfsetNumber:number+1];
  35. }
  36. -(void)pullOut{
  37. [selfsetNumber:number-1];
  38. }
  39. -(void)printNumber{
  40. NSLog(@"Boxnumberis:%d",number);
  41. }
  42. @end
这个类的作用是,初始化Box时,number数字是0,可以用pushIn 方法往Box里推入数字,每调用一次,number加1.当number数字大于等于6时产生SomethingException异常,告诉你数字达到或超过6了,超过10时产生SomeOverException异常,小于1时产生普通的NSException异常。

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

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

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

  1. -(void)viewDidLoad
  2. {
  3. [superviewDidLoad];
  4. NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
  5. Box*box=[[Boxalloc]init];
  6. for(inti=0;i<5;i++){
  7. [boxpushIn];
  8. [boxprintNumber];
  9. }
  10. }
打印结果:

Box number is: 1

Box number is: 2

Box number is: 3

Box number is: 4

Box number is: 5

3.2 超过6,产生异常

  1. for(inti=0;i<11;i++){
  2. [boxpushIn];
  3. [boxprintNumber];
  4. }
  1. 2012-07-0409:12:05.889ObjectiveCTest[648:f803]Boxnumberis:1
  2. 2012-07-0409:12:05.890ObjectiveCTest[648:f803]Boxnumberis:2
  3. 2012-07-0409:12:05.890ObjectiveCTest[648:f803]Boxnumberis:3
  4. 2012-07-0409:12:05.890ObjectiveCTest[648:f803]Boxnumberis:4
  5. 2012-07-0409:12:05.891ObjectiveCTest[648:f803]Boxnumberis:5
  6. 2012-07-0409:12:05.891ObjectiveCTest[648:f803]***Terminatingappduetouncaughtexception'BoxWarningException',reason:'Thenumberisaboveorat60'
这是时,程序抛出异常崩溃了。那怎么使程序不崩溃呢,做异常处理。

3.3、加上异常处理

  1. for(inti=0;i<11;i++){
  2. @try{
  3. [boxpushIn];
  4. }
  5. @catch(SomethingException*exception){
  6. NSLog(@"%@%@",[exceptionname],[exceptionreason]);
  7. }
  8. @catch(SomeOverException*exception){
  9. NSLog(@"%@",[exceptionname]);
  10. }
  11. @finally{
  12. [boxprintNumber];
  13. }
  14. }
运行,程序没有崩溃,打印结果:
  1. 2012-07-0409:14:35.165ObjectiveCTest[688:f803]Boxnumberis:1
  2. 2012-07-0409:14:35.167ObjectiveCTest[688:f803]Boxnumberis:2
  3. 2012-07-0409:14:35.167ObjectiveCTest[688:f803]Boxnumberis:3
  4. 2012-07-0409:14:35.167ObjectiveCTest[688:f803]Boxnumberis:4
  5. 2012-07-0409:14:35.167ObjectiveCTest[688:f803]Boxnumberis:5
  6. 2012-07-0409:14:35.167ObjectiveCTest[688:f803]BoxWarningExceptionThenumberisaboveorat60
  7. 2012-07-0409:14:35.168ObjectiveCTest[688:f803]Boxnumberis:6
  8. 2012-07-0409:14:35.168ObjectiveCTest[688:f803]BoxWarningExceptionThenumberisaboveorat60
  9. 2012-07-0409:14:35.168ObjectiveCTest[688:f803]Boxnumberis:7
  10. 2012-07-0409:14:35.168ObjectiveCTest[688:f803]BoxWarningExceptionThenumberisaboveorat60
  11. 2012-07-0409:14:35.168ObjectiveCTest[688:f803]Boxnumberis:8
  12. 2012-07-0409:14:35.168ObjectiveCTest[688:f803]BoxWarningExceptionThenumberisaboveorat60
  13. 2012-07-0409:14:35.169ObjectiveCTest[688:f803]Boxnumberis:9
  14. 2012-07-0409:14:35.169ObjectiveCTest[688:f803]BoxWarningExceptionThenumberisaboveorat60
  15. 2012-07-0409:14:35.169ObjectiveCTest[688:f803]Boxnumberis:10
  16. 2012-07-0409:14:35.169ObjectiveCTest[688:f803]BoxOverflowException
  17. 2012-07-0409:14:35.225ObjectiveCTest[688:f803]Boxnumberis:11
超过10时,SomeOverException异常抛出。

3.4 、小于0时的异常

在Box类的setNumber里,当number小于0时,我们抛出普通异常。
  1. @try{
  2. [boxsetNumber:-10];
  3. }
  4. @catch(NSException*exception){
  5. NSLog(@"%@",[exceptionname]);
  6. }
  7. @finally{
  8. [boxprintNumber];
  9. }
打印结果:
  1. 2012-07-0409:17:42.405ObjectiveCTest[753:f803]BoxUnderflowException
  2. 2012-07-0409:17:42.406ObjectiveCTest[753:f803]Boxnumberis:-10

著作权声明:本文由http://blog.csdn.net/totogo2010/原创,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢!

你可能感兴趣的:(Objective-C)