Android开发:UncaughtExceptionHandler捕获全局异常

# 前言

应用当前界面崩溃停留在上个页面,看不到崩溃日志?

Android的logcat控制台,看不到应用崩溃的日志?

如何拦截到未捕获的异常,并打印出来,帮助我们快速定位到代码问题呢?

最近同事跟我反应说开发的应用run的时候发生了崩溃,但是在logcat中,只看到了应用重启的日志,类似下面这样的:

# 寻找方案

那么怎样查看错误日志,快速定位问题的原因呢?

1,由于崩溃的概率不会那么多,最开始的时候,纯靠手速:知道操作哪里会崩溃,先把logcat控制台清下logcat控制台日志,然后操作应用,快速Ctrl+Alt+A(QQ的截屏快捷键);呵呵这个考验手速的方案,肯定不可取;

2,通过切换channel进程和dead进程查看错误日志,这个能看到一些日志,但是也不是很全面,不可取;

查看channel和dead进程

3,根据业务粗略定位产生问题的代码段,通过try catch包裹,通过debug跟踪代码一步步跟到问题所在;这种适合代码逻辑清晰、简单地方,如果循环、接口回调、多线程等操作比较多,是很不易跟到具体问题的。

4,最好的方案是拦截到正常代码中未捕获的异常,然后能够单独打印出来,方便我们调试和查看。接下来就看下如何去实现拦截未捕获的异常的。

# 确定方案

首先,我们要先了解一个UncaughtExceptionHandler,它能帮助我们捕获到全局的异常,具体用法是Application的onCreate方法中调用

@Override

public void onCreate() {

super.onCreate();

    // 以下用来捕获程序崩溃异常

// 程序崩溃时触发线程

    Thread.setDefaultUncaughtExceptionHandler(new OwnUncaughtExceptionHandler());

}

其中OwnUncaughtExceptionHandler继承UncaughtExceptionHandler,并重写uncaughtException方法,

public class OwnUncaughtExceptionHandlerimplements Thread.UncaughtExceptionHandler {

@Override

    public void uncaughtException(Thread thread, Throwable ex) {

StackTraceElement[] elements = ex.getStackTrace();

        StringBuilder reason =new StringBuilder(ex.toString());

        if (elements !=null && elements.length >0) {

for (StackTraceElement element : elements) {

reason.append("\n");

                reason.append(element.toString());

            }

}

Log.e("zyq", reason.toString());

        android.os.Process.killProcess(android.os.Process.myPid());

    }

}

# 看到结果

然后保存再运行你的程序,就可以在logcat中看到程序崩溃相应的日志了,如果程序没有崩溃,你可以自己造个空指针异常试验下,在logcat控制台可以看到:

注意:过滤日志的地方选择 No Filters

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android应用中,可以通过全局捕获异常来避免应用闪退。可以通过以下步骤实现: 1. 创建一个自定义的Application类,并在其中重写`Thread.UncaughtExceptionHandler`接口的`uncaughtException`方法。 2. 在`uncaughtException`方法中处理全局异常,例如记录异常信息、上传日志或者进行其他处理操作。 3. 在Application的onCreate方法中,将自定义的UncaughtExceptionHandler设置为默认的异常处理器。 下面是一个示例代码: ```java public class MyApplication extends Application implements Thread.UncaughtExceptionHandler { @Override public void onCreate() { super.onCreate(); // 设置全局异常处理器 Thread.setDefaultUncaughtExceptionHandler(this); } @Override public void uncaughtException(Thread thread, Throwable ex) { // 处理全局异常,例如记录异常信息、上传日志等操作 Log.e("MyApplication", "Uncaught Exception: " + ex.getMessage()); // 重启应用或者执行其他操作 restartApp(); } private void restartApp() { // 重启应用,可以根据实际需求来实现 Intent intent = new Intent(getApplicationContext(), MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_ONE_SHOT); AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, pendingIntent); // 退出应用 System.exit(0); } } ``` 记得在AndroidManifest.xml文件中将自定义的Application类配置为应用的默认Application类: ```xml <application android:name=".MyApplication" ...> ... </application> ``` 通过以上步骤,当应用发生未捕获异常时,会调用自定义的异常处理方法,你可以在其中进行相应的处理操作,例如记录异常信息、上传日志等。最后,你可以选择重启应用或者执行其他操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值