我有代码在代码中创建一个按钮(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
答案 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
子句中正确捕获该异常。
这里的问题在于null
和Obj-C
中处理.NET
的不同方式。在.NET中,在null
对象实例上调用实例方法会引发NullReferenceException
,而在Obj-C
中,向nil
发送消息(调用方法)是完全有效的。 。调用的结果为nil
,不会产生异常或错误。
在某些情况下,与您的一样,Xamarin.iOS
无法处理本机代码返回的nil
并崩溃。你无法捕捉到那个例外。
有些唠叨者称这是一个漏洞的抽象,但如果你是一个积极的人,那就下次做一个心理记录。