@try-Objective-Cのcatchブロック


193

@tryブロックが機能しないのはなぜですか?アプリをクラッシュさせましたが、@ tryブロックによってキャッチされるはずでした。

 NSString* test = [NSString stringWithString:@"ss"];

 @try {
    [test characterAtIndex:6];

 }
 @catch (NSException * e) {
    NSLog(@"Exception: %@", e);
 }
 @finally {
    NSLog(@"finally");
 }

上に貼り付けた正確なコードが正常に機能するため、それは他のものではないのですか?2010-07-29 16:45:57.677 test [93103:207]例外:***-[NSCFString characterAtIndex:]:範囲またはインデックスが範囲外です2010-07-29 16:45:57.678 test [93103:207]最後に
mbogh

2
NSString * test = [NSString stringWithString:@ "ss"];を置き換えることができます。NSString * test = @ "ss";
Duyen-Hoa 2014

回答:


136

すべてが完璧に動作します:)

 NSString *test = @"test";
 unichar a;
 int index = 5;
    
 @try {
    a = [test characterAtIndex:index];
 }
 @catch (NSException *exception) {
    NSLog(@"%@", exception.reason);
    NSLog(@"Char at index %d cannot be found", index);
    NSLog(@"Max index is: %lu", [test length] - 1);
 }
 @finally {
    NSLog(@"Finally condition");
 }

ログ:

[__NSCFConstantString characterAtIndex:]:範囲外または範囲外のインデックス

インデックス5の文字が見つかりません

最大インデックスは:3

最後に条件付け


8
正しいが少し誤解を招く-@finallyブロックは両方のケースで、つまり例外がスローされたかどうかに関係なく実行されることに注意してください。
Elendurwen 2017年

ええ、これが恋しいです:)
iTux

@Elendurwenが指摘したように修正してください。
Sanich 2018年

78

今、私は問題を見つけました。

obj_exception_throwブレークポイントからを削除すると、これが解決しました。これで@tryブロックに捕捉され、ブロックが欠落しているNSSetUncaughtExceptionHandler場合にもこれを処理し@tryます。


10
デバッガーが中断したときに続行を押すと、例外がスローされ、ハンドラーによってキャッチされます。
JeremyP 2010

1

Objective-CはJavaではありません。Objective-Cでは、例外と呼ばれています。例外!エラー処理に使用しないでください。彼らの提案ではありません。characterAtIndexを使用する前に文字列の長さを確認するだけで、すべて問題ありません。


Objective-Cでtry-catchを使用することは、ARCを混乱させる可能性があるため、通常はお勧めできません。
遅い
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.