2

Xcode の奇妙な動作を発見しました。Xcode デバッガーは、このコードのキャッチされない例外で中断しません。

@try            { @throw @"AA"; }
@catch (...)    { @throw;       }
@finally        { return;       }

ただし、このコードの例外がキャッチされ、デバッグのために Xcode ブレークの実行がトリガーされます。

@try            { @throw @"AA"; }
@catch (...)    { @throw;       }
@finally        {               }

@finallyブロックreturnのデバッガーが例外をキャッチできない場合。この問題を見たことがありますか?これが本当に問題なのかどうかはわかりません。見方によっては、設計された動作のように見えます。どうしてか分かりません。ブロックreturnするべきではないですか?@finally私の問題は、例外を静かに飲み込むため、検出できないことです。

残念なことに、try...catch...finally の動作がよくわかりません。例外をキャッチするコードはほとんど使用していません。これは設計された動作ですか、それともバグのある動作ですか? これは既知の問題ですか?

ここに私の環境があります。

  • Xcode バージョン 4.4 (4F250)
  • OS X 10.7.4

編集

完全なテスト ソース コードを添付します。

#import <Foundation/Foundation.h>

int main (int a, char** b)
{
    @try
    {
        NSLog(@"trying something...");

        @try            { @throw @"AA"; }
        @catch (...)    { @throw;       }
        @finally        { return 0;     }
    }
    @catch (...)
    {
        NSLog(@"something catched.");
    }
    @finally
    {
        NSLog(@"finally...");
    }
}
4

1 に答える 1

1

@finallyreturnブロックに a を入れるのは悪い考えのようです。例外処理メカニズムは、スローされた例外を処理するときに、コール スタックをアンワインドしようとします。@finally ブロックがスタックの内容を変更すると、例外ハンドラーが弱体化します。これがクラッシュすることはまったく驚くべきことではないようです。

また、bbum が指摘したように、例外は Cocoa と Cocoa Touch のフロー制御には使用されません。通常、Cocoa メソッドを介して例外をスローすると失敗します。あなたがやっていることは、一般的な Objective-C で動作すると思われる場合でも、実際のコードでは問題を引き起こす可能性があります。

簡単な答え:そうしないでください。

于 2012-08-11T19:15:08.627 に答える