First, preface
If an unhandled exception occurs in Android, the program will Flash, which is a very bad user experience, many users will uninstall the app, so the unhandled exception should be avoided as much as possible.
There are some hard to avoid exceptions (such as IO, network, etc.) that should be captured in the code and handled accordingly to prevent the program from crashing.
But "no program is perfect", and all kinds of Android terminal also greatly increased the probability of abnormal appearance, even the powerful QQ, and so will not flash back!
At this point, you need to catch the unhandled exception globally and handle it. (Note: the processing in this article does not prevent app Flash )
Processing Method: Collect exception information, current scene [time, hardware parameters], upload to the server at the right time
role:1, easy to repair the next version of the Bug 2, easy to help users to solve the difficulties caused by the exception
Second, refer to the way of Java Android (this is the pit AH)
Xamarin.android can refer to Java Android code in a lot of times, so I implemented "catch unhandled exception" in the way Java Android did
[Obsolete] Public classCrashHandler:Thread.IUncaughtExceptionHandler {//system default Uncaughtexception processing class PrivateThread.iuncaughtexceptionhandler Mdefaulthandler; //Crashhandler Instances Private StaticCrashhandler INSTANCE =NewCrashhandler (); //context object for the program PrivateContext Mcontext; /// <summary> ///guaranteed only one Crashhandler instance/// </summary> PrivateCrashhandler () {}/// <summary> ///get Crashhandler instances, Singleton mode/// </summary> /// <returns></returns> Public StaticCrashhandler getinstance () {returnINSTANCE; } PublicIntPtr Handle {Get{returnThread.CurrentThread (). Handle; } } Public voidDispose () { This. Dispose (); } /// <summary> ///Initialize/// </summary> /// <param name= "context" ></param> Public voidInit (Context context) {Mcontext=context; //get the system default Uncaughtexception processorMdefaulthandler =Thread.defaultuncaughtexceptionhandler; //set the Crashhandler as the default processor for the programThread.defaultuncaughtexceptionhandler = This; } ///when uncaughtexception occurs, it is transferred to the function to handle Public voiduncaughtexception (thread thread, Throwable ex) {if(! HandleException (ex) && Mdefaulthandler! =NULL) { //let the system default exception handler handle if the user does not handlemdefaulthandler.uncaughtexception (thread, ex); } Else { //Exit ProgramAndroid.OS.Process.KillProcess (Android.OS.Process.MyPid ()); Javasystem.exit (1); } } /// <summary> ///Exception Handling/// </summary> /// <param name= "ex" ></param> /// <returns>Returns true if the exception information is handled, otherwise false.</returns> Private BOOLHandleException (Throwable ex) {if(ex = =NULL) { return false; } //handlers (important information such as recording exceptions, device information, time, etc.)//************ //TipsTask.run (() ={looper.prepare (); //can be replaced by more friendly hintsToast.maketext (Mcontext,"Sorry, the program is abnormal and is about to exit.", Toastlength.long). Show (); Looper.loop (); }); //stop for a while and let the previous operation finishSystem.Threading.Thread.Sleep ( -); return true; } }
View Code
[Application (Label ="MyApplication")] Public classmyapplication:application { PublicMyApplication (IntPtr javareference, jnihandleownership transfer):Base(javareference, transfer) {} Public Override voidOnCreate () {Base. OnCreate (); Crashhandler Crashhandler=crashhandler.getinstance (); Crashhandler.init (ApplicationContext); } }
View Code
Customize an exception handling class Crashhandler by implementing the Java.Lang.Thread.IUncaughtExceptionHandler interface and replace the Java.Lang.Thread.DefaultUncaughtExceptionHandl Er
When uncaughtexception occurs, it is transferred to the Uncaughtexception method in the Crashhandler class, where the exception is handled.
Then create an exception throw new Exception ("I am an exception!") "), I thought the program would enter the Uncaughtexception method in the Crashhandler class, but the result is not, that is, this way failed, why? Google found that Iuncaughtexceptionhandler can only capture the Dalvik runtime exception, mono runtime C # exception, this does not work.
So this way no, pit pits!
Third, the right way to capture
[Application (Label ="MyApplication")] Public classmyapplication:application { PublicMyApplication (IntPtr javareference, jnihandleownership transfer):Base(javareference, transfer) {} Public Override voidOnCreate () {Base. OnCreate (); //Registering unhandled Exception EventsAndroidenvironment.unhandledexceptionraiser + =Androidenvironment_unhandledexceptionraiser; //Crashhandler Crashhandler = Crashhandler.getinstance (); //Crashhandler.init (applicationcontext); } protected Override voidDispose (BOOLdisposing) {Androidenvironment.unhandledexceptionraiser-=Androidenvironment_unhandledexceptionraiser; Base. Dispose (disposing); } voidAndroidenvironment_unhandledexceptionraiser (Objectsender, Raisethrowableeventargs e) {Unhandledexceptionhandler (e.exception, E); } /// <summary> ///Handling Unhandled Exceptions/// </summary> /// <param name= "E" ></param> Private voidUnhandledexceptionhandler (Exception ex, Raisethrowableeventargs e) {//handlers (important information such as recording exceptions, device information, time, etc.)//************** //TipsTask.run (() ={looper.prepare (); //can be replaced by more friendly hintsToast.maketext ( This,"Sorry, the program is abnormal and is about to exit.", Toastlength.long). Show (); Looper.loop (); }); //stop for a while and let the previous operation finishSystem.Threading.Thread.Sleep ( -); E.handled=true; } }
View Code
Register Unhandled Exception Event Androidenvironment.unhandledexceptionraiser + = Androidenvironment_unhandledexceptionraiser; Exception handling is performed in Androidenvironment_unhandledexceptionraiser.
Create an exception throw new Exception ("I am an exception!") "), and duly entered the Androidenvironment_unhandledexceptionraiser,ok, and succeeded!
Description: After catching the exception of the specific processing, is nothing more than reading hardware information, time, exception information, and save to the local, in the right time to upload to the service side, in order to highlight the focus, I do not realize here.
SOURCE download
Https://github.com/jordanqin/CatchException
Reference:
Http://forums.xamarin.com/discussion/4576/application-excepionhandler
http://blog.csdn.net/liuhe688/article/details/6584143
If you find the article helpful, you can click the "recommend" button next to it, which will give more people the opportunity to see
Xamarin.android-Catching unhandled exception (global exception)