iOS SDKメモ try-catch-finallyの構文を使ってみる
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の構文を使うと、使わないときと比べて実行速度や使用メモリ量に影響あるらしい。
んまま、明日の自分へのメモってことで。
ディスカッション
ピンバック & トラックバック一覧
[…] iOS SDKメモ try-catch-finallyの構文を使ってみる – tetsuyanbo https://www.tetsuyanbo.net/tetsuyanblog/9885 […]