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

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

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
NSLog(@"case 1");
@try
{
NSLog(@"*** try ***");
NSLog(@"try?");
}
@catch (NSException *exception)
{
NSLog(@"*** catch ***");
// 例外の内容をコンソールへ出力する
NSLog(@"name :%@",exception.name);
NSLog(@"reason:%@",exception.reason);
}
@finally
{
NSLog(@"*** finally ***");
}
NSLog(@"case 1"); @try { NSLog(@"*** try ***"); NSLog(@"try?"); } @catch (NSException *exception) { NSLog(@"*** catch ***"); // 例外の内容をコンソールへ出力する NSLog(@"name :%@",exception.name); NSLog(@"reason:%@",exception.reason); } @finally { NSLog(@"*** finally ***"); }
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のブロック内のコードは実行される

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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 ***
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 ***
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 ***

次に例外ありのコード。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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 ***");
}
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 ***"); }
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のブロック内のコードは実行される

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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 ***
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 ***
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の構文を使うと、使わないときと比べて実行速度や使用メモリ量に影響あるらしい。

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