当抛出异常并在按钮事件中处理时,应用程序退出Real iPhone?

时间:2013-03-26 04:27:04

标签: c# mono xamarin.ios

我有代码在代码中创建一个按钮(UIButton)并将其指定为子视图......一切正常,除了我调试代码以记录异常,所以我创建了一个名为“Create Exception”的按钮,按钮处理程序执行真正简单的代码:

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

显然,除了获取Null Reference异常并捕获它之外,这不会做任何事情。并且忽略它......

在模拟器中,一切都很好......在真实设备中?是的,App退出时出现空引用异常!! WTF?

昨天更新的最新Monotouch ......

我担心我的所有异常都不能捕获并路由到Log.Exeception()代码......这就是我试图首先测试的...

这是一个匿名函数,分配给按钮的Touch处理程序..

-Chert

---更新,错误:

  

日期/时间:2013-03-25 22:26:59.269 -0500操作系统版本: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_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(内部)_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

4 个答案:

答案 0 :(得分:1)

我认为您正在使用崩溃报告库(例如TestFlight)。这些崩溃报告库将在Xamarin.iOS之前处理空引用异常,并将异常视为崩溃(从而导致应用程序崩溃)。

您可以在此处阅读更好的说明:How to prevent iOS crash reporters from crashing MonoTouch apps?(也有解决方案)。

答案 1 :(得分:0)

代码try块明显不正确。 null对象无法调用.ToString(),而在catch块中,ex变量无处可寻。

仔细检查逻辑。

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

答案 2 :(得分:0)

嗯...

这有效:

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

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

这意味着尝试在ToString()对象上调用null而抛出的异常实际上会占用整个应用程序!一个编译人员...我的测试现在有效,我很高兴...

-Chert

答案 3 :(得分:0)

正如您自己想象的那样,如果使用throw new Exception ()抛出异常,则会在catch子句中正确捕获该异常。

这里的问题在于nullObj-C中处理.NET的不同方式。在.NET中,在null对象实例上调用实例方法会引发NullReferenceException,而在Obj-C中,向nil发送消息(调用方法)是完全有效的。 。调用的结果为nil,不会产生异常或错误。

在某些情况下,与您的一样,Xamarin.iOS无法处理本机代码返回的nil并崩溃。你无法捕捉到那个例外。

有些唠叨者称这是一个漏洞的抽象,但如果你是一个积极的人,那就下次做一个心理记录。