2013-03-26 61 views
1

我有代碼在代碼中創建一個按鈕(UIButton),並將它指定爲子視圖...除了我正在調試我的代碼以記錄異常,所以我創建了一個名爲「Create Exception」的按鈕,按鈕處理程序真正簡單的代碼:當引發異常並在按鈕事件中處理時,應用程序在真實iPhone上退出?

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

顯然,這不會做,除了得到一個空引用異常,並抓住它..而忽略了這事......

在模擬器,一切都好和好...在一個真正的設備?是的,應用程序退出與空引用異常! WTF?

最新的MonoTouch作爲更新昨天的......

我擔心我的所有異常不會趕上並於Log.Exeception()的代碼路徑......這是我試圖測試在首位...

這是分配給按鈕的觸摸處理匿名函數..

-Chert

---更新,錯誤:

Date/Time: 2013-03-25 22:26:59.269 -0500 OS Version: iPhone OS 5.1.1 (9B206) Report Version: 104

Exception Type: EXC_CRASH (SIGSEGV) Exception Codes: 0x00000000, 0x00000000 Crashed Thread: 1

Thread 0 name: Dispatch queue: com.apple.main-thread 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_opt (mini.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_exception_from_name_domain (exception.c:70) 7
TestApp 0x00bdfd3e mono_get_exception_null_reference (exception.c:40) 8 TestApp 0x00b79944 mono_handle_exception_internal + 60 9 TestApp
0x00b7a22a mono_handle_exception (mini-exceptions.c:1894) 10 TestApp 0x00bab8f6 handle_signal_exception (exceptions-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:] + 46 17 UIKit
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:] + 374 24 UIKit
0x3305068e -[UIApplication sendEvent:] + 350 25 UIKit
0x3304ff34 _UIApplicationHandleEvent + 5820

+0

它不是「退出」。你的應用程序崩潰。真實的設備不等於模擬器。圖書館和建築是不同的。什麼是錯誤? – Raptor 2013-03-26 04:30:31

+0

是的,我知道一個應用程序在崩潰時會退出 - 這不是一次正常關機。 I.E.終止應用程序...而且我也知道該設備不是模擬器......在我看來(如最初所述),它是一個空引用異常 - 就像我創建的,但它就像它沒有做try/catch塊! – 2013-03-26 05:08:53

+0

它可能會在另一行代碼處崩潰。很遺憾地告訴你,你的崩潰日誌沒有顯示任何有用的東西。這就是爲什麼建議使用本機代碼,以便於調試 – Raptor 2013-03-26 05:17:18

回答

1

我想你正在使用崩潰報告庫(如TestFlight)。這些崩潰報告庫將在Xamarin.iOS之前處理空引用異常,並將異常視爲崩潰(從而導致應用程序崩潰)。

你可以在這裏閱讀更好的描述:How to prevent iOS crash reporters from crashing MonoTouch apps?(它也有一個解決方案)。

+0

謝謝!是的,我正在使用TestFlight,我將實施您建議的解決方案... – 2013-03-27 08:08:59

0

代碼是try塊顯然是不正確的。一個空對象不能調用.ToString(),而在catch塊中,ex變量來自無處。

仔細檢查邏輯。

try { 
    // crash something 
} catch(Exception) { 
    // caught something 
} 
+0

這個按鈕是用來引發異常 - 爲了測試Log.Exeception()代碼...但是,只要拋出並捕獲異常就會導致程序崩潰...這是我想要解決的問題... – 2013-03-26 06:09:38

+0

另外,ex在評論中是「used」:-) – 2013-03-26 06:15:25

+0

但您註釋掉了'Log.Exception()'行。此外,你應該使用適當的try catch塊 – Raptor 2013-03-26 06:17:39

0

嗯......

這工作:

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

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

這意味着,得到由試圖調用ToString()一個null對象上拋出的異常竟然會拿出全部的應用程序!一個編譯器的傢伙...我的測試,現在的工作,我很高興與...

-Chert

0

當你想通了你自己,如果有異常使用throw new Exception()拋出,它的正確抓在catch條款中。

這裏的問題在於nullObj-C.NET中的不同處理方式。在.NET中,調用null對象實例上的實例方法會拋出NullReferenceException,而在Obj-C中,將消息(調用方法)發送到nil是完全有效的。通話結果爲nil,不會產生異常或錯誤。

在某些情況下,比如你的,Xamarin.iOS無法處理由本機代碼返回的nil和崩潰。你無法捕捉到這個例外。

一些懷疑者會稱這是一個漏洞抽象,但如果你是一個積極的人,只需要下一次心理注意。

+0

@rolfbjarnekving說了什麼。那是我正在尋找的帖子。 – 2013-03-26 09:01:20

相關問題