捕捉异常有用的方法

 今天先记录一下捕捉异常有用的一个用法.
   总会因为一些异常未能捕捉而跳出程序,这时如果有这个类会很有帮助,而且可以尝试把错误记录下来,写在SD卡上,以便研究.
   具体用法如下:
   1 先实例化用于处理未捕捉异常的类,我命名为CrashHandler
      public class CrashHandler implements UncaughtExceptionHandler {    //实现UncaughtExceptionHandler接口
             private String TAG = "CrashHandler";
             private static CrashHandler INSTANCE = new CrashHandler();
             private Context mContext;
             private Thread.UncaughtExceptionHandler mDefaultHandler;

             private CrashHandler()
            {

            }

            public static CrashHandler getInstance()       //实现单例模式
            {
                return INSTANCE;
            }

             public void init(Context context)
             {
                 mContext = context;
                 //获取系统默认的UncaughtExceptionHandler
                 mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
                 //设置当前CrashHandler为程序默认处理器
                 Thread.setDefaultUncaughtExceptionHandler(this);
             }


             @Override              //处理未接收的异常
             public void uncaughtException(Thread thread, Throwable e)
            {
                  // TODO Auto-generated method stub
                  if (!handleException(e) && mDefaultHandler != null) {
                      mDefaultHandler.uncaughtException(thread, e);
                  } else {
                      try {
                         Thread.sleep(3000);
                      } catch (InterruptedException ex) {
                          ex.printStackTrace();
                      }
       
                      //退出或重启
                      android.os.Process.killProcess(android.os.Process.myPid());
                      System.exit(1);
       
                     /*
                     Intent intent = new Intent();
                     intent.setClass(mContext, PhoneChainActivity.class);
                     intent.addFlag(Intent.FLAG_ACTIVITY_NEW_TASK);
                     mContext.startActivity(intent);
                     android.os.Process.killProcess(android.os.Process.myPid());
                     */
                 }
           }

          /** 
              * 自定义错误处理,收集错误信息,发送错误报告等操作均在此完成 
              *  
              * @param ex 
              * @return true:如果处理了该异常信息;否则返回 false 
              */  
           private boolean handleException(Throwable ex) 
          {  
               if (ex == null) {  
                   return false;  
               }  
               // 使用 Toast 来显示异常信息  
              new Thread() {  
                  @Override  
                   public void run() {  
                       Looper.prepare();  
                       Toast.makeText(mContext, "很抱歉,程序出现异常,即将退出。", Toast.LENGTH_LONG).show();  
                       Looper.loop();  
                  }  
              }.start();  
          
             // 收集设备参数信息  
             collectDeviceInfo(mContext);  
             // 保存日志文件  
             saveCrashInfo2File(ex);  
             return true;  
        }  
          ......
     }

   2 在你的程序中调用它
      在Application类中调动,替换掉原来的处理.
      public class PhoneChainApp extends Application {
          @Override
           public void onCreate() 
           {
                ......
                CrashHandler crashHandler = CrashHandler.getInstance();  
                 crashHandler.init(getApplicationContext());
           }
      }

      这样在程序遇到未处理异常时会先显示"程序要退出"信息之后再退出软件,同时会把信息保留下来,以便寻找BUG.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值