2012-12-08 11 views
9

私のアプリでmain.mにアプリクラッシュが発生し、クラッシュが発生した場所がxcodeに表示されないため、エラーが発生している理由がわかりません。返されたUIApplicationMain(argc、argv ...)は何も教えてくれません。Objective-CでのTry-Catch同等

Objective-CにC++のtry/catchと同等の機能を持たせて、エラーの発生場所を正確に確認する方法はありますか?

+2

[この質問に対する回答](http://stackoverflow.com/questions/8100054/no-exception-stack-trace-in-console-under-xcode-4-2-ios- 5)。 –

+0

ありがとうございます。これは私の問題を解決しました。問題は、セレクタメソッドの名前と大文字のUであり、実際のメソッドは小文字のuを持っていました。 コンパイラはそれを(悪い、悪い)それをキャッチしませんでしたが、リンクのソリューションは私に問題が何であるかを正確に教えてくれました。再度、感謝します。 –

答えて

8

enter image description here enter image description here

私は以下のトライキャッチ構文を与えたが、それに加えて、何を行うことができますすることはXcodeで、あなたはブレークポイントを設定することができ、ということです。プロジェクトエクスプローラの左側で、[ブレークポイント]タブをクリックします。左下に+が表示されます。 (上の写真)それをクリックすると、例外ブレークポイントを設定するオプションが表示されます。これが行うことは、クラッシュが発生しているどのラインでも停止することです。そこではtry catch文をどこに設定する必要はありません。

@try { 

    // Your statements here 
} 
@catch (NSException * e) { 
    NSLog(@"Exception: %@", e); 
} 
@finally { 
    NSLog(@"finally"); 
} 
+1

上記を参照してください。NSLog(@スタックトレース:%@ "、[e callStackSymbols]); ' –

13

のObjective-Cは@try/@catchを持っていますが、はるかにあなたを助けるために行くのではありません。 @catchに到達するまでに、エラーが発生したスタックフレームはなくなります。あなたが必要なもの

は、ブレークポイントを設定することです、その例外上休憩:ブレークポイントナビゲーターページ(右から2番目のボタン)を開き、ナビゲーターページの下部にある[+]をクリックしてください。 "Add Exception Breakpoint ..."を選択し、[完了]をクリックします。

これで、プログラムが例外をスローするたびにデバッガがブレークします。

+0

これを試してみました。 +1は非常に良い指示です。問題は、int main(int argc、char * argv [])の同じ場所で再び停止することです。スタックトレースはアセンブリ言語で書かれていますが、例外をどのように読み取るかわかりません。私が見落としているその他の詳細は? –

+2

これをあなたの '@ catch'に追加してください:NSLog(@スタックトレース:%@"、[例外callStackSymbols]); ' –

+0

@HotLicksあなたが上に投稿したコメントと素晴らしいリンクに感謝します! – dasblinkenlight

3
//////////////////////ADVANCED TRY CATCH SYSTEM//////////////////////////////////////// 
    #ifndef UseTryCatch 
    #define UseTryCatch 1 
    #ifndef UsePTMName 
    #define UsePTMName 0 //USE 0 TO DISABLE AND 1 TO ENABLE PRINTING OF METHOD NAMES WHERE EVER TRY CATCH IS USED 
    #if UseTryCatch 
    #if UsePTMName 
    #define TCSTART @try{NSLog(@"\n%s\n",__PRETTY_FUNCTION__); 
    #else 
    #define TCSTART @try{ 
    #endif 
    #define TCEND }@catch(NSException *e){NSLog(@"\n\n\n\n\n\n\ 
    \n\n|EXCEPTION FOUND HERE...PLEASE DO NOT IGNORE\ 
    \n\n|FILE NAME   %s\ 
    \n\n|LINE NUMBER  %d\ 
    \n\n|METHOD NAME  %s\ 
    \n\n|EXCEPTION REASON %@\ 
    \n\n\n\n\n\n\n",strrchr(__FILE__,'/'),__LINE__, __PRETTY_FUNCTION__,e);}; 
    #else 
    #define TCSTART { 
    #define TCEND } 
    #endif 
    #endif 
    #endif 
    //////////////////////ADVANCED TRY CATCH SYSTEM//////////////////////////////////////// 






Use TRY CATCH IN ANY METHOD LIKE THIS 


-(void)anyMethodThatCanGenerateException 
{ 
    TCSTART 


    TCEND 
}