转载请注明出处:http://blog.csdn.net/supluo/article/details/42101569
Xamarin可以用c#来开发Android应用程序,这个就不用多说了。
说说用c#来开发android和用Java来开发android两者之间在异常处理上面需要注意的地方:
见以下简短的代码:
button.Click += delegate {
try{
throw new System.Exception("抛出SystemException");
}
catch (Java.Lang.Exception ex){
Text.Text = "捕获Java.lang..Exception:" + ex.Message;
}
};
button2.Click += delegate{
try {
throw new Java.Lang.Exception("抛出Java.lang.");
}
catch (Exception ex) {
Text.Text = "捕获System.Exception:" + ex.Message;
}
};
代码很简单,我相信大家都看的懂,使用xamarin来开发android的有可能是原本就会c#,因此想通过这个转向移动平台,还有的是本身会java,但是工作需求需要转向C#来开发。
说这些的原因,主要是想引出,在java开发android这个广为人知的平台上,大家都知道,在java中异常的基类是Java.Lang.Exception,而在c#中是System.Exception,大家在开发过程中可能会误解为最终所有c#相关的会全部转换为Java相关的(因为习惯了android是Java来开发的),因此可能会误解为Java.Lang.Exception = System.Exception,至少可能在效果上认为两者具有相等性.
但是经过测试,两者在效果上有很大区别,上面的示例代码中,第一个按钮的事件捕获不了异常,而第二个按钮的事件能够捕获异常,第一个按钮会抛出UncaughtException,看到这个大家可能会有点诧异,在实践过程中,我们明明就抓了异常,但是有些时候还是会抛出一些未捕获的异常,我想其中一个原因就是因为这个,至少我曾犯这样的错误,因为在引用明明空间的时候,我们可能把java的异常类命名空间using进来了,因此程序中的Exception就默认为Java.Lang.Exception,而catch 这个异常,并不能捕获System.Exception,终于知道原因了,高兴!至少经过我测试实践是这个样子,我认为这样产生的原因,也是在于平台的差异性和中间解释层以及开发者以往的经验造成的。
对此我也明白了为什么在Application的子类中设置了Java.Lang.Thread.DefaultUncaughtExceptionHandler却并不能捕获到程序未处理的异常,偶尔却能获取,原因应该就是它只能捕获java.lang.exception及其子类类别的异常!
红色这句话有误,暂不知道具体原因还未来的深入研究..