返回顶部
首页 > 资讯 > 移动开发 >Android 记录未捕获异常
  • 800
分享到

Android 记录未捕获异常

异常捕获Android 2022-06-06 13:06:35 800人浏览 泡泡鱼
摘要

文章目录一、CrashHandler二、初始化三、测试四、打印 stackTrace 一、CrashHandler 自定义 Crash 处理器:

文章目录一、CrashHandler二、初始化三、测试四、打印 stackTrace 一、CrashHandler

自定义 Crash 处理器:

object CrashHandler : Thread.UncaughtExceptionHandler {
    private val defaultHandler = Thread.getDefaultUncaughtExceptionHandler()
    fun init() {
        Thread.setDefaultUncaughtExceptionHandler(this)
    }
    override fun uncaughtException(thread: Thread, throwable: Throwable) {
        Log.d("~~~", "$thread, $throwable")
        defaultHandler?.uncaughtException(thread, throwable)
    }
}
二、初始化

Application 中初始化此 CrashHandler:

class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        CrashHandler.init()
    }
}

我们在 CrashManager 中调用

Thread.setDefaultUncaughtExceptionHandler
函数将默认的未捕获异常处理器设置为 CrashHandler 类,当存在未捕获异常时,系统会回调
uncaughtException
方法,我们可以在此方法中将崩溃信息打印出来,或保存到 sd 卡中。

为了不影响系统原有的处理未捕获异常的逻辑,我们在

init
方法中先将默认的崩溃处理器保存下来,存储在 defaultHandler 中,在
uncaughtException
方法中让默认的 handler 也处理此异常。

三、测试

在 MainActivity 中测试一下,本例中布局文件只有一个 id 为 btn 的按钮,故不再给出布局文件:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        btn.setOnClickListener {
            throw NullPointerException("test")
        }
    }
}

点击按钮,LoGCat 会打印出以下日志

~~~: Thread[main,5,main], java.lang.NullPointerException: test
四、打印 stackTrace

修改 CrashHandler,将崩溃的 stackTrace 打印出来:

object CrashHandler : Thread.UncaughtExceptionHandler {
    private val defaultHandler = Thread.getDefaultUncaughtExceptionHandler()
    fun init() {
        Thread.setDefaultUncaughtExceptionHandler(this)
    }
    override fun uncaughtException(thread: Thread, throwable: Throwable) {
        Log.d("~~~", StringBuilder("$thread, $throwable, stackTrace: ").apply {
            throwable.stackTrace.forEach {
                appendln(it.toString())
            }
        }.toString())
        defaultHandler?.uncaughtException(thread, throwable)
    }
}

修改后,再运行上述测试,Logcat 输出:

~~~: Thread[main,5,main], java.lang.NullPointerException: test, stackTrace: com.example.crashmanager.MainActivity$onCreate$1.onClick(MainActivity.kt:14)
    Android.view.View.perfORMClick(View.java:7251)
    android.view.View.performClickInternal(View.java:7228)
    android.view.View.access$3500(View.java:802)
    android.view.View$PerformClick.run(View.java:27843)
    android.os.Handler.handleCallback(Handler.java:883)
    android.os.Handler.dispatchMessage(Handler.java:100)
    android.os.Looper.loop(Looper.java:214)
    android.app.ActivityThread.main(ActivityThread.java:7116)
    java.lang.reflect.Method.invoke(Native Method)
    com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
    com.android.internal.os.ZyGoteInit.main(ZygoteInit.java:925)

作者:AlpinistWang


--结束END--

本文标题: Android 记录未捕获异常

本文链接: https://lsjlt.com/news/28895.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作