Android CrashHandler编写自己的异常捕获的方法

平时写代码,我们可能会抛出各种异常,这些异常有些是我们测试过程中发现进行解决的,但是也有一些异常是我们未知的,不论是代码的逻辑问题还是Android本身底层的一些bug,我们都需要及时了解并进行解决。当用户在使用app出现崩溃现象时我们需要知道是什么原因,并将原因记录下来上到服务器,这样以后我们就可以知道具体是什么原因了 

CrashHandler类

用于记录crash原因保存到sd卡中。

public class CrashHandler implements Thread.UncaughtExceptionHandler {
  private static final String TAG = "CrashHandler";
  private static final boolean DEBUG = true;
  //文件路径
  private static final String PATH = Environment.getExternalStorageDirectory().getPath() +File.separator+ "crash";
  private static final String FILE_NAME = "crash";
  private static final String FILE_NAME_SUFEIX = ".trace";
  private static Thread.UncaughtExceptionHandler mDefaultCrashHandler;
  private static CrashHandler mCrashHandler = new CrashHandler();
  private Context mContext;

  private CrashHandler() {
  }

  public static CrashHandler getInstance() {
    return mCrashHandler;
  }

  public void init(Context context) {
    mDefaultCrashHandler = Thread.getDefaultUncaughtExceptionHandler();
    Thread.setDefaultUncaughtExceptionHandler(this);
    mContext = context.getApplicationContext();
  }

  @Override
  public void uncaughtException(Thread thread, Throwable ex) {
    try {
      //将文件写入sd卡
      writeToSDcard(ex);
      //写入后在这里可以进行上传操作
    } catch (IOException e) {
      e.printStackTrace();
    } catch (PackageManager.NameNotFoundException e) {
      e.printStackTrace();
    }
    ex.printStackTrace();
    //如果系统提供了默认异常处理就交给系统进行处理,否则自己进行处理。
    if (mDefaultCrashHandler != null) {
      mDefaultCrashHandler.uncaughtException(thread, ex);
    } else {
      Process.killProcess(Process.myPid());
    }
  }

  //将异常写入文件
  private void writeToSDcard(Throwable ex) throws IOException, PackageManager.NameNotFoundException {
    //如果没有SD卡,直接返回
    if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
      return;
    }
    File filedir = new File(PATH);
    if (!filedir.exists()) {
      filedir.mkdirs();
    }
    long currenttime = System.currentTimeMillis();
    String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(currenttime));

    File exfile = new File(PATH +File.separator+FILE_NAME+time + FILE_NAME_SUFEIX);
    PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(exfile)));
    Log.e("错误日志文件路径",""+exfile.getAbsolutePath());
    pw.println(time);
    PackageManager pm = mContext.getPackageManager();
    PackageInfo pi = pm.getPackageInfo(mContext.getPackageName(), PackageManager.GET_ACTIVITIES);
    //当前版本号
    pw.println("App Version:" + pi.versionName + "_" + pi.versionCode);
    //当前系统
    pw.println("OS version:" + Build.VERSION.RELEASE + "_" + Build.VERSION.SDK_INT);
    //制造商
    pw.println("Vendor:" + Build.MANUFACTURER);
    //手机型号
    pw.println("Model:" + Build.MODEL);
    //CPU架构
    pw.println("CPU ABI:" + Build.CPU_ABI);

    ex.printStackTrace(pw);
    pw.close();

  }

}

调用

public class BaseApplication extends Application {
  @Override
  public void onCreate() {
    super.onCreate();
    CrashHandler crashHandler=CrashHandler.getInstance();
    crashHandler.init(this);
  }
}

测试

 mButton.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        throw new RuntimeException("抛出一个异常");
      }
    });

最后记得添加文件权限,并调用BaseApplication

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android使用CrashHandler来获取应用的crash信息的方法

    在日常开发的过程中应该不可避免的会发生 crash,无论你的程序写的多么完美,都不可能完全避免 crash 的发生,可能是由于 Android 底层的 bug,也可能是由于不充分的机型适配或者是糟糕的网络状况.当 crash 发生时,系统就会kill掉正在执行的程序,现象就是闪退,或者提醒用户程序已经停止运行,这对用户来说是很不友好的,也是我们不愿意看到的,更早的是当用户发生 crash,我们开发者却无法得知程序为何 crash,即便我们想去解决这个 bug,但是由于无法知道用户当时的 cras

  • Android CrashHandler编写自己的异常捕获的方法

    平时写代码,我们可能会抛出各种异常,这些异常有些是我们测试过程中发现进行解决的,但是也有一些异常是我们未知的,不论是代码的逻辑问题还是Android本身底层的一些bug,我们都需要及时了解并进行解决.当用户在使用app出现崩溃现象时我们需要知道是什么原因,并将原因记录下来上到服务器,这样以后我们就可以知道具体是什么原因了 CrashHandler类 用于记录crash原因保存到sd卡中. public class CrashHandler implements Thread.UncaughtEx

  • Android编程实现项目中异常捕获及对应Log日志文件保存功能

    本文实例讲述了Android编程实现项目中异常捕获及对应Log日志文件保存功能.分享给大家供大家参考,具体如下: 做程序开发,肯定离不开与BUG打交道,更加离不开程序异常的出现.在开发的时候,我们可以通断点调试,日志打印,异常捕获工具等方式发现或处理程序中的Exception.那客户在使用我们的应用时,程序了问题,我们怎么可以知道呢?当然,我们可以加上友盟统计等第三方工具.另外还能怎么做呢?那就是把异常信息通过文档地形式保存下来,如果用户在使用的时候程序出了异常,可以让用户把对应的日志信息发给我

  • Android崩溃异常捕获方法

    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面.而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里.但平时使用的时候给你闹崩溃,那你就欲哭无泪了. 那么今天主要讲一下如何去捕捉系统出现的Unchecked异常.何为Unchecked异常呢,换句话说就是指非受检异常,它不能用try-catch来显示捕捉. 我们先从Exception讲起.Exception分为两类:一种是CheckedException,一种是UncheckedException

  • Android 全局异常捕获实例详解

    Android 全局异常捕获 今天就来说说作为程序猿的我们每天都会遇到的东西bug,出bug不可怕可怕的是没有出bug时的堆栈信息,那么对于bug的信息收集就显得尤为重要了,一般用第三方bugly或者友盟等等都能轻易收集,但是由于公司不让使用第三方,而安卓正好有原生的异常收集类UncaughtExceptionHandler,那么今天博客就从这个类开始. UncaughtExceptionHandler见名知意,即他是处理我们未捕获的异常,具体使用分两步 1.实现我们自己的异常处理类 publi

  • Android Force Close 出现的异常原因分析及解决方法

    一.原因: forceclose,意为强行关闭,当前应用程序发生了冲突. NullPointExection(空指针),IndexOutOfBoundsException(下标越界),就连Android API使用的顺序错误也可能导致(比如setContentView()之前进行了findViewById()操作)等等一系列未捕获异常 二.如何避免 如何避免弹出Force Close窗口 ,可以实现Thread.UncaughtExceptionHandler接口的uncaughtExcepti

  • express异步函数异常捕获示例详解

    在express中时使用 Async/await 编写异步代码时,每个 async 函数都要包裹在try/catch中,代码量多了看着冗余不优雅,express又不像koa的异步机制可以订阅全局的error事件,为了解决这个问题,需要写个捕获异步函数异常的中间件. uncaughtException 开始能想到的肯定是try/catch了,但是也想过能否使用nodejs提供的uncaughtException事件,在全局捕获异常,例如下面的代码: process.on("uncaughtExce

  • Android 是如何捕捉 java 异常的

    目录 一. java 异常全局捕捉 二.小知识 1.如何捕获异常不退出 2.如何捕获指定线程异常 3.ThreadGroup 和 Thread 的关系结构 一. java 异常全局捕捉 用于 java 异常全局捕捉代码: val default = Thread.getDefaultUncaughtExceptionHandler() ​ Thread.setDefaultUncaughtExceptionHandler { t, e -> // 处理异常 Log.e("Uncaught&

  • 详解Java中多线程异常捕获Runnable的实现

    详解Java中多线程异常捕获Runnable的实现 1.背景: Java 多线程异常不向主线程抛,自己处理,外部捕获不了异常.所以要实现主线程对子线程异常的捕获. 2.工具: 实现Runnable接口的LayerInitTask类,ThreadException类,线程安全的Vector 3.思路: 向LayerInitTask中传入Vector,记录异常情况,外部遍历,判断,抛出异常. 4.代码: package step5.exception; import java.util.Vector

  • python中异常捕获方法详解

    在Python中处理异常使用的是try-except代码块,try-except代码块放入让python执行的操作,同时告诉python程序如果发生了异常该怎么办,try-except这个功能其实很多入门书籍中都放到了高级篇幅里,在入门的时候一般不会讲这个使用,尤其是作为运维人员,如果你经常写shell,转到python后估计也很少使用这个功能,这功能我觉得说明了shell和python的一个重要区别,因为python是一门真正的编程语言,像其它的编程语言php,java等都会提供异常捕获功能,

  • Android 驱动编写LED-NDK程序

    1. 首先编写LINUX内核模块LED #include <linux/kernel.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/slab.h> #include <linux/device.h> #include <asm/io.h> #include <asm/uaccess.h> #include <linux/cdev.

随机推荐