9

次の Cocoa/Obj-C コード スニペットを検討してください。

MyClass *obj;
@try {
    [obj doSomething];
}
@catch (NSException * e) {
    NSLog(@"Exception occurred: %@", [e description]);
}
@finally {
    [obj cleanUp];
}

MyClass *obj;
@try {
    [obj doSomething];
}
@catch (NSException * e) {
    NSLog(@"Exception occurred: %@", [e description]);
}
[obj cleanUp];

[obj cleanUp]最初のスニペットが呼び出され、2 番目のスニペットが呼び出されないのはどのような状況[obj cleanUp]ですか? 言い換えれば、@finallyCocoa 例外処理を使用する場合、どのような状況で非冗長になるのでしょうか?

4

5 に答える 5

15

これらのシナリオでは、例外が飲み込まれるため、違いはありません。違いある 2 つのシナリオを次に示します。

[obj cleanUp] が呼び出されます:

MyClass *obj;
@try {
    [obj doSomething];
}
@catch (NSException * e) {
    @throw;      
}
@finally {
    [obj cleanUp]; // called when exception is caught
}

[obj cleanUp] は呼び出されません:

MyClass *obj;
@try {
    [obj doSomething];
}
@catch (NSException * e) {
    @throw;
}
[obj cleanUp]; // not called when exception is caught
于 2009-04-12T13:44:07.920 に答える
7

ブロック内のコードは、制御が何らかの理由でブロックを@finally終了したときに実行されることにも注意してください。例えば:@tryreturngoto

@try {
    doStuff();
    if(bail){
        return;
    }
    doMoreStuff();
}
@finally {
    [obj cleanUp];
}
[obj announceSuccess];

[obj cleanUp]bailが true の場合でも実行されますが、実行[obj announceSuccess]されません。

于 2010-11-10T20:53:34.747 に答える
5

その場合、例外を押しつぶす場所はありません。@finally例外をキャッチしない場合、または再スローする場合にクリーンアップするために使用されます。どちらの場合も、呼び出し元のコードに最終的な例外応答を残します。Cocoa の例外は、プログラミング エラーにのみ使用されることが想定されており、めったに発生しないため、これを行うのはまったく合理的なことです。

を使用する必要がない1 つのケースを指摘することも価値があります@finally。これは、独自の autorelease プールをセットアップする場合です。「親」自動解放プールが破棄されると、まだクリーンアップされていない内側のプールも破棄されます。自分でクリーンアップしようとする場合は、自動解放プールから例外自体を昇格させる必要があります。

于 2009-04-12T11:01:44.003 に答える
1

いつ:

  • 発生した例外のタイプをキャッチしていません
  • 例外をキャッチしましたが、catch ブロック内のコードも例外をスローします。
于 2009-04-12T11:05:41.327 に答える
0

低レベルの質問ですが、なぜこれを行うのですか?

try/catch/finally アプローチは Java で広く使用されていますが、Objective-C ではほとんど使用されておらず、推奨されるアプローチではありません。ライブラリは、Java ライブラリ呼び出しのように例外をスローしないため、必要ありません。独自のライブラリを作成している場合、呼び出し元がキャッチする例外を自然に探すとは思わないでください。

最も広く使用され、理解されている規則は、エラー メソッドのコールバックを持つデリゲートの規則、または複数レベルのコードを通過する必要があるより一般的なエラーの通知である可能性があります。Cocoa が設定したような単純な通知システムがあれば、このアプローチは Java の世界でより広く使用される可能性があります。

デリゲート アプローチには、Java で例外を宣言するのと同じ文書化プロパティがあります。これらは単に異なるアプローチですが、他の方法をとらなければならない非常にやむを得ない理由がない限り、一般的には、手元の言語により適したアプローチを使用することをお勧めします。

于 2009-04-13T06:26:25.013 に答える