iOS SDKメモ try-catch-finallyの構文を使ってみる

iPad,プログラミング

JavaとかC#とかではメジャーなtry-catch-finallyの構文をObjective-Cで書いてみる。

まずは、例外なしのコード。

NSLog(@"case 1");
@try
{
	NSLog(@"*** try     ***");
	NSLog(@"try?");
}
@catch (NSException *exception)
{
	NSLog(@"*** catch   ***");
	// 例外の内容をコンソールへ出力する
	NSLog(@"name  :%@",exception.name);
	NSLog(@"reason:%@",exception.reason);
}
@finally
{
	NSLog(@"*** finally ***");
}

結果はこんな感じ。

  • tryのブロック内のコードは最後まで実行される
  • catchのブロック内のコードは実行されない
  • finallyのブロック内のコードは実行される

実際の結果はこんな感じ。

2012-01-18 01:56:20.697 ProtoTryCatch[1258:707] case 1
2012-01-18 01:56:20.703 ProtoTryCatch[1258:707] *** try ***
2012-01-18 01:56:20.724 ProtoTryCatch[1258:707] try?
2012-01-18 01:56:20.728 ProtoTryCatch[1258:707] *** finally ***

次に例外ありのコード。
NSLog(@"case 2");
@try
{
	NSLog(@"*** try     ***");
	// わざと例外を投げてみる
	[[NSException exceptionWithName:@"Exception" reason:@"TestCode" userInfo:nil] raise];
	NSLog(@"try?");
}
@catch (NSException *exception)
{
	NSLog(@"*** catch   ***");
	// 例外の内容をコンソールへ出力する
	NSLog(@"name  :%@",exception.name);
	NSLog(@"reason:%@",exception.reason);
}
@finally
{
	NSLog(@"*** finally ***");
}

結果はこんな感じ。

  • tryのブロック内のコードはNSException(例外が発生する)直前まで実行される
  • catchのブロック内のコードは実行される
  • finallyのブロック内のコードは実行される

実際の結果はこんな感じ。

2012-01-18 01:58:33.053 ProtoTryCatch[1274:707] case 2
2012-01-18 01:58:33.131 ProtoTryCatch[1274:707] *** try ***
2012-01-18 01:58:33.135 ProtoTryCatch[1274:707] *** catch ***
2012-01-18 01:58:33.135 ProtoTryCatch[1274:707] name :Exception
2012-01-18 01:58:33.137 ProtoTryCatch[1274:707] reason:TestCode
2012-01-18 01:58:33.138 ProtoTryCatch[1274:707] *** finally ***

ちなみに、Cにはそもそもtry-catch-finallyの構文がなく、C++にfinallyがないそうな(try-catchだけ)。
あと、try-catch-finallyの構文を使うと、使わないときと比べて実行速度や使用メモリ量に影響あるらしい。

んまま、明日の自分へのメモってことで。