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!!!



相关文章
|
6月前
|
Java UED
【JavaSE专栏68】异常的捕获和处理,try-catch-finally高效解决异常处理问题
【JavaSE专栏68】异常的捕获和处理,try-catch-finally高效解决异常处理问题
|
17天前
|
Java
Java程序设计中的异常处理技巧
异常处理是Java程序设计中不可或缺的重要部分。本文将探讨Java中异常处理的基本概念,介绍常见的异常类型及其处理技巧,以及如何优化异常处理代码,提高程序的健壮性和可维护性。通过学习本文,读者将能够更好地理解和应用异常处理机制,写出更加稳健的Java程序。
|
5月前
|
Python
60 python - 异常处理中抛出异常
60 python - 异常处理中抛出异常
24 0
|
5月前
|
Java 编译器
java语言对异常处理运行的初步探索(try-catch-finally)(上)
java语言对异常处理运行的初步探索(try-catch-finally)
25 0
|
5月前
|
Java
java语言对异常处理运行的初步探索(try-catch-finally)(下)
java语言对异常处理运行的初步探索(try-catch-finally)()
29 0
|
8月前
|
安全 Python
一文彻底搞懂Python异常处理:try-except-else-finally
一文彻底搞懂Python异常处理:try-except-else-finally
|
8月前
|
安全 Python
彻底搞懂Python异常处理:try-except-else-finally
彻底搞懂Python异常处理:try-except-else-finally
|
Python
Python编程:exception异常处理
Python编程:exception异常处理
117 0