最近开发时应用出现崩溃,但是看不到当时的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应用异常退出"这个主题,就是关于如何处理程序中的未捕获异常,以防止应用突然崩溃,从而提升用户体验。在这个问题上,我们可以从以下几个方面来探讨: 1. **...
在Java编程语言中,`UncaughtException`处理是程序中不可或缺的一部分,因为它涉及到程序的健壮性和稳定性。当一个线程非正常终止,也就是说抛出了一个未捕获的异常,而这个异常没有被该线程或者其父线程的任何...
app运行时,可能会出现异常,尤其是空指针等严重bug...为了屏蔽不友好的界面提示,android中有UncaughtExceptionHandler来处理这个问题。此程序就是一个介绍如何把UncaughtExceptionHandler应用到android app中的demo。
UncaughtException处理类,当程序发生Uncaught异常的时候,有该类来接管程序,并记录发送错误报告. 获取CrashHandler实例 ,单例模式 崩溃处理 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成. 收集设备参数...
Uncaught Exception(解决方案).md
标题“Uncaught DOMException:”通常出现在JavaScript编程中,指的是在执行代码时遇到了一个未捕获的DOM(Document Object Model)异常。这个错误通常意味着在访问或操作DOM元素时发生了问题,可能是由于尝试访问不...
domain-middleware, 在 `domain` 模块中,用于连接的`uncaughtException` 中间件 域中间件 面向连接的uncaughtException 中间件,基于 domain 模块。尝试制作更好的连接域 MODULE 。警告:不要忽略错误 ! ...
在Android开发中,"UnCaught-Exception: Android中未捕获的异常。 (很遗憾,应用已关闭)" 是一个常见的错误提示,意味着应用程序在执行过程中遇到了无法处理的异常,导致程序崩溃。这个错误通常会中断用户体验,并...
要实现`UncaughtExceptionHandler`,我们需要创建一个新的类,该类实现`UncaughtExceptionHandler`接口,并提供`uncaughtException()`方法的实现。`uncaughtException()`方法接收两个参数:一个是抛出异常的线程对象...
Fatal error: Uncaught exception 'com_exception' with message 'Failed to create COM object `InternetExplorer.Application': 拒绝访问
android在产品上线以后为了能够实时捕获异常,需要写一个异常捕获的类,这个类在你遇到异常的时候会执行uncaughtException这个方法,然后你就可以对异常进行一些操作。
这是一个全局的未捕获异常处理器,当应用程序中某个线程抛出了一个未捕获的异常,系统会调用这个处理器的`uncaughtException()`方法。 1. **设置全局异常处理器**: 要自定义异常处理,我们需要创建一个类去继承`...