1

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

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

显然,除了获取空引用异常并捕获它之外,这不会做任何事情......并忽略它......

在模拟器中,一切都很好……在真实设备中?是的,应用程序退出时出现空引用异常!!怎么回事?

昨天更新的最新 Monotouch...

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

这是在分配给按钮的触摸处理程序的匿名函数中。

-燧石

--- 更新,错误:

日期/时间: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_cexception:70_from.
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 17UIKit
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 -[UI4 UIWindow sendEvent:] + 374
0x3305068e -[UIApplication sendEvent:] + 350 25 UIKit
0x3304ff34 _UIApplicationHandleEvent + 5820

4

4 回答 4

1

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

您可以在此处阅读更好的描述:如何防止 iOS 崩溃报告器使 MonoTouch 应用程序崩溃?(这也有一个解决方案)。

于 2013-03-26T08:40:15.987 回答
0

正如您自己发现的那样,如果使用 抛出异常throw new Exception (),它会正确地被捕获在catch子句中。

这里的问题在于 in和 innull的处理方式不同。在.NET中,对对象实例调用实例方法会引发. 调用结果为,不会产生异常或错误。Obj-C.NETnullNullReferenceExceptionObj-Cnilnil

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

一些抱怨者会称这是一种泄漏的抽象,但如果你是一个积极的人,下次只需在心里记下。

于 2013-03-26T08:33:54.883 回答
0

出色地...

这有效:

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

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

这意味着通过尝试调用对象而引发的异常ToString()实际上null会占用整个应用程序!一个给编译器的人......我的测试现在可以工作了,我很高兴......

-燧石

于 2013-03-26T07:26:01.030 回答
0

代码是try块显然是不正确的。空对象不能调用.ToString(),并且在catch块中,ex变量来自无处。

仔细检查逻辑。

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