`
bell0901
  • 浏览: 28572 次
社区版块
存档分类
最新评论

(笔记)Android获取UncaughtException

阅读更多

    最近开发时应用出现崩溃,但是看不到当时的crash信息,没办法快速找到问题所在。后来在书中找到获取应用crash信息的方法,以此记录。

    crash发生时,系统会kill掉正在执行的程序,出现闪退或者提示用户程序已停止运行。开发人员也无法直接得知程序为何crash。Android提供了处理未捕获异常的方法。可以通过UncaughtExceptionHandler来监视应用的crash信息,给程序设置一个UncaughtExceptionHandler,当crash发生时,就会调用UncaughtExceptionHandler的uncaughtException方法,在uncaughtException方法里可以获取到异常信息,可以选择把异常信息存储。

import android.content.Context;
import android.os.Environment;
import android.os.Process;
import android.util.Log;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Created by Rewufu on 2016/2/17.
 */
public class CrachHandler implements Thread.UncaughtExceptionHandler {
    private static CrachHandler crachHandler = new CrachHandler();
    private Thread.UncaughtExceptionHandler uncaughtExceptionHandler;
    private Context mContext;
    private static final String PATH = Environment.getExternalStorageDirectory().getPath()+"/UncaughtException/";
    private static final String FILE_NAME = "crash";
    private static final String FILE_NAME_SUFFIX = ".trace";

    public static CrachHandler getInstance() {
        return crachHandler;
    }

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

    @Override
    public void uncaughtException(Thread thread, Throwable ex) {

        try {
            dumpExceptionToSDcard(ex);
        } catch (IOException e) {
            e.printStackTrace();
        }

        if(uncaughtExceptionHandler != null){
            uncaughtExceptionHandler.uncaughtException(thread, ex);
        }else {
            Process.killProcess(Process.myPid());
        }

    }

    private void dumpExceptionToSDcard(Throwable ex) throws IOException{
        if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            Log.w("CrachHandler", "sdcard unmounted,skip dump exception");
            return;
        }

        File dir = new File(PATH);
        if(!dir.exists()){
            dir.mkdir();
        }
        long current = System.currentTimeMillis();
        String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(current));
        File file = new File(PATH + FILE_NAME + time + FILE_NAME_SUFFIX);
        PrintWriter printWriter = new PrintWriter(new BufferedWriter(new FileWriter(file)));
        printWriter.print(time);
        printWriter.println();
        ex.printStackTrace(printWriter);
        printWriter.close();
    }
}

     上面就是代码实现,首先实现一个UncaughtExceptionHandler对象,在它的uncaughtException方法获取异常信息并存储,调用Thread的setDefaultUncaughtExceptionHandler将它设置为线程默认的异常处理器。

    可以选择在Application初始化时为线程设置CrashHandler。

import android.app.Application;

/**
 * Created by Rewufu on 2016/2/17.
 */
public class Myapplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        CrachHandler crachHandler = CrachHandler.getInstance();
        crachHandler.init(getApplicationContext());
    }
}

     手动模拟发生crash,抛出一个RuntimeException测试一下,crash就会保存下来。

                throw new RuntimeException("自己抛出RuntimeException");

     

分享到:
评论

相关推荐

    UncaughtException不让Android应用异常退出

    "UncaughtException不让Android应用异常退出"这个主题,就是关于如何处理程序中的未捕获异常,以防止应用突然崩溃,从而提升用户体验。在这个问题上,我们可以从以下几个方面来探讨: 1. **...

    UncaughtException处理类

    在Java编程语言中,`UncaughtException`处理是程序中不可或缺的一部分,因为它涉及到程序的健壮性和稳定性。当一个线程非正常终止,也就是说抛出了一个未捕获的异常,而这个异常没有被该线程或者其父线程的任何...

    Android UncaughtException_test

    app运行时,可能会出现异常,尤其是空指针等严重bug...为了屏蔽不友好的界面提示,android中有UncaughtExceptionHandler来处理这个问题。此程序就是一个介绍如何把UncaughtExceptionHandler应用到android app中的demo。

    java_android_UncaughtException处理类,当程序发生异常的时候,由该类接管程序,并记录报告

    UncaughtException处理类,当程序发生Uncaught异常的时候,有该类来接管程序,并记录发送错误报告. 获取CrashHandler实例 ,单例模式 崩溃处理 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成. 收集设备参数...

    Uncaught Exception(解决方案).md

    Uncaught Exception(解决方案).md

    Uncaught DOMException:

    标题“Uncaught DOMException:”通常出现在JavaScript编程中,指的是在执行代码时遇到了一个未捕获的DOM(Document Object Model)异常。这个错误通常意味着在访问或操作DOM元素时发生了问题,可能是由于尝试访问不...

    domain-middleware, 在 `domain` 模块中,用于连接的`uncaughtException` 中间件.zip

    domain-middleware, 在 `domain` 模块中,用于连接的`uncaughtException` 中间件 域中间件 面向连接的uncaughtException 中间件,基于 domain 模块。尝试制作更好的连接域 MODULE 。警告:不要忽略错误 ! ...

    UnCaught-Exception:Android中未捕获的异常。 (很遗憾,应用已关闭)错误处理程序

    在Android开发中,"UnCaught-Exception: Android中未捕获的异常。 (很遗憾,应用已关闭)" 是一个常见的错误提示,意味着应用程序在执行过程中遇到了无法处理的异常,导致程序崩溃。这个错误通常会中断用户体验,并...

    UncaughtExceptionHandler Demo

    要实现`UncaughtExceptionHandler`,我们需要创建一个新的类,该类实现`UncaughtExceptionHandler`接口,并提供`uncaughtException()`方法的实现。`uncaughtException()`方法接收两个参数:一个是抛出异常的线程对象...

    Uncaught exception com_exception with message Failed to create COM object

    Fatal error: Uncaught exception 'com_exception' with message 'Failed to create COM object `InternetExplorer.Application': 拒绝访问

    捕获全局异常UnException

    android在产品上线以后为了能够实时捕获异常,需要写一个异常捕获的类,这个类在你遇到异常的时候会执行uncaughtException这个方法,然后你就可以对异常进行一些操作。

    拦截android系统异常

    这是一个全局的未捕获异常处理器,当应用程序中某个线程抛出了一个未捕获的异常,系统会调用这个处理器的`uncaughtException()`方法。 1. **设置全局异常处理器**: 要自定义异常处理,我们需要创建一个类去继承`...

Global site tag (gtag.js) - Google Analytics