私のアプリでmain.mにアプリクラッシュが発生し、クラッシュが発生した場所がxcodeに表示されないため、エラーが発生している理由がわかりません。返されたUIApplicationMain(argc、argv ...)は何も教えてくれません。Objective-CでのTry-Catch同等
Objective-CにC++のtry/catchと同等の機能を持たせて、エラーの発生場所を正確に確認する方法はありますか?
私のアプリでmain.mにアプリクラッシュが発生し、クラッシュが発生した場所がxcodeに表示されないため、エラーが発生している理由がわかりません。返されたUIApplicationMain(argc、argv ...)は何も教えてくれません。Objective-CでのTry-Catch同等
Objective-CにC++のtry/catchと同等の機能を持たせて、エラーの発生場所を正確に確認する方法はありますか?
私は以下のトライキャッチ構文を与えたが、それに加えて、何を行うことができますすることはXcodeで、あなたはブレークポイントを設定することができ、ということです。プロジェクトエクスプローラの左側で、[ブレークポイント]タブをクリックします。左下に+が表示されます。 (上の写真)それをクリックすると、例外ブレークポイントを設定するオプションが表示されます。これが行うことは、クラッシュが発生しているどのラインでも停止することです。そこではtry catch文をどこに設定する必要はありません。
@try {
// Your statements here
}
@catch (NSException * e) {
NSLog(@"Exception: %@", e);
}
@finally {
NSLog(@"finally");
}
上記を参照してください。NSLog(@スタックトレース:%@ "、[e callStackSymbols]); ' –
のObjective-Cは@try
/@catch
を持っていますが、はるかにあなたを助けるために行くのではありません。 @catch
に到達するまでに、エラーが発生したスタックフレームはなくなります。あなたが必要なもの
は、ブレークポイントを設定することです、その例外上休憩:ブレークポイントナビゲーターページ(右から2番目のボタン)を開き、ナビゲーターページの下部にある[+]をクリックしてください。 "Add Exception Breakpoint ..."を選択し、[完了]をクリックします。
これで、プログラムが例外をスローするたびにデバッガがブレークします。
これを試してみました。 +1は非常に良い指示です。問題は、int main(int argc、char * argv [])の同じ場所で再び停止することです。スタックトレースはアセンブリ言語で書かれていますが、例外をどのように読み取るかわかりません。私が見落としているその他の詳細は? –
これをあなたの '@ catch'に追加してください:NSLog(@スタックトレース:%@"、[例外callStackSymbols]); ' –
@HotLicksあなたが上に投稿したコメントと素晴らしいリンクに感謝します! – dasblinkenlight
//////////////////////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
}
[この質問に対する回答](http://stackoverflow.com/questions/8100054/no-exception-stack-trace-in-console-under-xcode-4-2-ios- 5)。 –
ありがとうございます。これは私の問題を解決しました。問題は、セレクタメソッドの名前と大文字のUであり、実際のメソッドは小文字のuを持っていました。 コンパイラはそれを(悪い、悪い)それをキャッチしませんでしたが、リンクのソリューションは私に問題が何であるかを正確に教えてくれました。再度、感謝します。 –