1

コード内にボタン(UIButton)を作成し、それをサブビューとして割り当てるコードがあります...例外をログに記録するようにコードをデバッグしていたことを除いて、すべて正常に機能するため、「例外の作成」というボタンを作成しました。ハンドラーは実際の単純なコードを実行します。

try
{
    object Q = null;
    Q.ToString();   
}
catch
{
    //Log.Exception ("Test", ex);   
}

明らかに、これはNull参照例外を取得してキャッチする以外は何もしません..そしてそれを無視します...

シミュレーターでは、すべてがうまくいっています...実際のデバイスでは?ええ、アプリはnull参照例外で終了します!! WTF?

昨日のアップデート時点での最新のモノタッチ...

私のすべての例外がLog.Exeception()コードをキャッチしてルーティングしないのではないかと心配しています...これは、私が最初にテストしようとしていたものです...

これは、ボタンのタッチハンドラーに割り当てられている匿名関数にあります。

-チャート

---更新、エラー:

日時:2013-03-25 22:26:59.269 -0500 OSバージョン:iPhone OS 5.1.1(9B206)レポートバージョン:104

例外タイプ:EXC_CRASH(SIGSEGV)例外コード:0x00000000、0x00000000クラッシュしたスレッド:1

スレッド0名:ディスパッチキュー:com.apple.main-threadスレッド0:0
TestApp 0x00b5a2d8 load_method(aot-runtime.c:2661)1 TestApp 0x00b5ae86 mono_aot_get_method(aot-runtime.c:3097)2 TestApp 0x00b346c0 mono_jit_compile_method_with_ c:5089)3 TestApp
0x00b34c3a mono_jit_runtime_invoke(mini.c:5639)4 TestApp
0x00ba2b14 mono_runtime_invoke(object.c:2790)5 TestApp
0x00ba136a mono_runtime_object_init(object.c:105)6 TestApp 0x00bdfa30
mono_except
0x00bdfd3e mono_get_exception_null_reference(exception.c:40)8 TestApp 0x00b79944 mono_handle_exception_internal + 60 9 TestApp
0x00b7a22aのmono_handle_exception(ミニexceptions.c:1894)10でTestApp 0x00bab8f6 handle_signal_exception(例外-arm.c:559)11でTestApp 0x00102794 MonoTouch_UIKit_UIControlEventProxy_Activated(UIControl.cs:30)12でTestApp 0x009d9b14 wrapper_runtime_invoke_object_runtime_invoke_dynamic_intptr_intptr_intptr_intptr + 192 13でTestApp 0x00b34f44 mono_jit_runtime_invoke(mini.c。 5793)14 TestApp 0x00ba2b14 mono_runtime_invoke(object.c:2790)15 TestApp
0x00b2b6f0 native_to_managed_trampoline_MonoTouch_UIKit_UIControlEventProxy_Activated(:88)16 CoreFoundation 0x355763f6-[NSObject PerformSelector:withObject:withObject:]
0x3306be00-[UIApplication sendAction:to:from:forEvent:] + 56 18 UIKit 0x3306bdbc-[UIApplication sendAction:toTarget:fromSender:forEvent:] + 24 19 UIKit
0x3306bd9a-[UIControl sendAction:to:forEvent:] + 38 20 UIKit
0x3306bb0a -[UIControl(Internal)_sendActionsForEvents:withEvent:] + 486 21 UIKit 0x3306c442-[UIControl touchesEnded:withEvent:] + 470 22 UIKit
0x3306a924-[UIWindow _sendTouchesForEvent:] + 312 23 UIKit
0x3306a312-[UIWindow sendEvent:]
0x3305068e-[UIApplication sendEvent:] + 350 25 UIKit
0x3304ff34 _UIApplicationHandleEvent + 5820

4

4 に答える 4

1

クラッシュレポートライブラリ(TestFlightなど)を使用していると思います。これらのクラッシュレポートライブラリは、Xamarin.iOSが実行する前にnull参照例外を処理し、例外をクラッシュとして扱います(したがって、アプリがクラッシュします)。

ここでより良い説明を読むことができます:iOSクラッシュレポーターがMonoTouchアプリをクラッシュするのを防ぐ方法は?(これにも解決策があります)。

于 2013-03-26T08:40:15.987 に答える
0

コードはtryブロックが明らかに正しくありません。nullオブジェクトはを呼び出すことができず.ToString()catchブロック内では、ex変数はどこからも取得されません。

ロジックを再確認してください。

try {
  // crash something
} catch(Exception) {
  // caught something
}
于 2013-03-26T05:48:51.157 に答える
0

上手...

これは機能します:

try
   {
       throw new Exception("Test Exception");
   }

catch (Exception ex)
   {
   Log.Exception ("Test", ex);  
   }

ToString()これは、オブジェクトを呼び出そうとしてスローされる例外がnull実際にアプリ全体を削除することを意味します。コンパイラーの人のための1つ...私のテストは現在機能しています、そして私はそれに満足しています...

-チャート

于 2013-03-26T07:26:01.030 に答える
0

自分で理解したように、を使用して例外がスローされた場合、それは句throw new Exception ()に適切にキャッチされます。catch

ここでの問題は、でnull処理されるさまざまな方法にObj-Cあります.NET。.NETでは、オブジェクトインスタンスでインスタンスメソッドを呼び出すと、がnullスローされますが、.NETでは、にメッセージを送信する(メソッドを呼び出す)ことは完全に有効です。呼び出しの結果はになり、例外やエラーは生成されません。NullReferenceExceptionObj-Cnilnil

あなたのような場合には、ネイティブコードによって返されたものXamarin.iOSを処理できず、クラッシュします。nilそして、その例外をキャッチすることはできません。

一部の泣き言はこれを漏れのある抽象化と呼ぶでしょうが、あなたが前向きな人なら、次回のために心に留めておいてください。

于 2013-03-26T08:33:54.883 に答える