Xamarin System.Exception与Java.Lang.Exception之间需要主要的地方

来源:互联网 发布:微信上淘宝返利可信吗 编辑:程序博客网 时间:2024/05/21 08:52

转载请注明出处: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及其子类类别的异常!

红色这句话有误,暂不知道具体原因还未来的深入研究..

0 0