iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Android 是如何捕捉 java 异常的
  • 487
分享到

Android 是如何捕捉 java 异常的

2024-04-02 19:04:59 487人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、java异常全局捕捉二、小知识1、如何捕获异常不退出2、如何捕获指定线程异常3、ThreadGroup和Thread的关系结构一、 java 异常全局捕捉 用于 java 异

一、 java 异常全局捕捉

用于 java 异常全局捕捉代码:


 val default = Thread.getDefaultUncaughtExceptionHandler()
​
Thread.setDefaultUncaughtExceptionHandler { t, e ->
    // 处理异常
    Log.e("Uncaught", "exception message : "+ e.message)
    // 将异常回执给原注册的 handler
    default.uncaughtException(t, e)
}


以上是很简单的一段代码,经常被用于 java 异常全局捕捉,但我的疑问是,他是怎么实现全局捕捉的,带着这样的疑问,我们来扒一下代码看看。

顺藤摸瓜,我们看看静态方法 getDefaultUncaughtExceptionHandler 是被谁调用的,看了下所有的类调用的类,唯有 ThreadGroup 最靠谱:

parent 为空的情况下,就会调用 getDefaultUncaughtExceptionHandler 来回调异常,然后继续顺藤摸瓜,看看 ThreadGroup uncaughtException 是被谁触发的,搜了一个圈,没有一个靠谱的。在我踌躇时,顺带瞄了一眼注释,奇迹发现:


-   Called by the Java Virtual Machine when a thread in this
-   thread group stops because of an uncaught exception, and the thread
-   does not have a specific {[@link ](/link%20)Thread.UncaughtExceptionHandler}
-   installed.


意思是:当一个未捕获的异常导致线程组中的线程停止时,JVM 会调用该方法。那我们就去搜搜 jvm 的源码,看看是怎么触发这个方法的。 ​

Hotspot 虚拟机源码的 thread.cpp 中的 JavaThread::exit 方法发现了这样的一段代码,并且还给出了注释:

在线程调用 exit 退出时,如果有未捕获的异常,则会调用 Thread.dispatchUncaughtException 方法,然后我们继续跟踪该方法:

然后调用当前线程的 uncaughtException 分发异常:

有意思的来了,如果我们没有给当前线程设置 UncaughtExceptionHandler ,则会将这个异常交给当前线程的 ThreadGroup 处理。如果我们给当前线程设置了 UncaughtExceptionHandler,则当前线程发生了异常,永远也不会抛给 getDefaultUncaughtExceptionHandler,该功能适合捕捉当前线程异常来用。 ​

终于回到了我们起初看到的 ThreadGroup.UncaughtExceptionHandler 方法,贴回原来的图继续分析:

这个地方会继续判断 parent 是否为空,parent 是个 ThreadGroupThreadGroup 实现了 Thread.UncaughtExceptionHandler 接口。这里我就直接说答案了,后面再说 ThreadGroup 和 Thread 的关系,最终会走到 system 的 ThreadGroup,system 的 parent 是个空,这时候走 else 分支,获取 Thread 中的 getDefaultUncaughtExceptionHandler 静态变量,触发 uncaughtException 方法,由于我们在 Activity 中设置了这个静态变量,所以,我们收到了这个异常通知。 ​

二、小知识

1、如何捕获异常不退出


val default = Thread.getDefaultUncaughtExceptionHandler()
​
Log.e("Uncaught", "Uncaught handler: "+ default)
// Uncaught handler: com.Android.internal.os.RuntimeInit$KillApplicationHandler@21f02a3
​
Thread.setDefaultUncaughtExceptionHandler { t, e ->
    // 将异常回执给原注册的 handler
    // default.uncaughtException(t, e)
}


捕获异常后,什么都不处理。但这样做显得非常不地道,这样会导致其他框架无法通过之前设置的静态变量捕获到异常上报。我打印了一下 default 是 RuntimeInit,该类在捕获到异常后,会做 killProcess。 ​

2、如何捕获指定线程异常


val thread = Thread {
      val a = 1/0
}
thread.setUncaughtExceptionHandler { t, e ->
        Log.e("Uncaught", "Uncaught trace: "+ e.message)
}
thread.start() 



3、ThreadGroup 和 Thread 的关系结构

  • Thread parent 是在 new Thread 的时候指定的,构造可传自定义的 ThreadGroup,默认是使用创建当前线程的 ThreadGroup
  • Thread 添加进 ThreadGroup Thread[] 数组时机是在调用 start 启动线程的时候做的
  • ThreadGroup 的 parent 是在 new ThreadGroup 的时候指定的,构造可传自定义的 ThreadGroup,默认是使用当前线程的 ThreadGroup

到此这篇关于Android 是如何捕捉 java 异常的的文章就介绍到这了,更多相关Android 捕捉 java 异常内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Android 是如何捕捉 java 异常的

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android 是如何捕捉 java 异常的
    目录一、java异常全局捕捉二、小知识1、如何捕获异常不退出2、如何捕获指定线程异常3、ThreadGroup和Thread的关系结构一、 java 异常全局捕捉 用于 java 异...
    99+
    2024-04-02
  • c#中nmodbus如何捕捉异常
    在C#中,可以使用try-catch语句块来捕捉Modbus通信中的异常。以下是一个示例代码,演示如何捕捉Modbus异常: usi...
    99+
    2024-04-02
  • oracle存储过程异常如何捕捉
    在Oracle中,可以使用异常处理来捕获存储过程中的异常。在存储过程中,可以使用以下语句来捕获异常并进行处理:sqlDECLARE ...
    99+
    2023-10-25
    oracle
  • python异常的捕捉和补救实例详解
    1、捕捉特定异常 第一个符合条件的except语句会被执行,用于报告错误。如果仅仅是报告错误,程序依然会停止。 a = 0 try: b = 5/a except Zer...
    99+
    2024-04-02
  • 如何在Java中捕获异常
    今天就跟大家聊聊有关如何在Java中捕获异常,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2....
    99+
    2023-06-14
  • 小程序中怎么优雅的捕捉异步方法的异常
    小编给大家分享一下小程序中怎么优雅的捕捉异步方法的异常,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!传统方法在ES7之后,我们往往使用 async await 语...
    99+
    2023-06-22
  • java空指针异常如何捕获
    在Java中,可以使用try-catch语句块来捕获空指针异常(NullPointerException)。以下是一个简单的例子: ...
    99+
    2024-02-29
    java
  • 诊断系统故障的利器:异常捕捉与分析
    异常处理是编程中至关重要的技术,它使程序能够优雅地处理意外错误,防止系统崩溃。异常捕捉与分析是识别和解决系统故障的关键工具,可以大大加快故障排除过程。 异常捕捉 异常捕捉涉及将程序中的错误转换为异常对象,异常对象包含有关错误的详细信息,如...
    99+
    2024-04-02
  • python如何捕捉屏幕上的文字
    要捕捉屏幕上的文字,你可以使用Python中的pytesseract库。pytesseract是一个OCR(光学字符识别)库,可以用...
    99+
    2023-10-18
    python
  • java捕获异常后如何继续执行
    在Java中,可以使用try-catch语句来捕获异常并处理它们。一旦异常被捕获,程序会跳转到catch块中执行相应的代码,然后继续...
    99+
    2023-09-15
    java
  • cad鼠标捕捉老是跳动如何解决
    这篇文章主要介绍了cad鼠标捕捉老是跳动如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇cad鼠标捕捉老是跳动如何解决文章都会有所收获,下面我们一起来看看吧。cad鼠标捕捉老是跳动的解决办法:1、在电脑中...
    99+
    2023-07-05
  • java全局异常捕获的方法是什么
    Java全局异常捕获的方法是使用try-catch块来捕获异常。在Java中,可以使用捕获异常的方式来处理程序中的异常情况。全局异常...
    99+
    2023-10-21
    java
  • Python编程中如何捕获警告ps不是捕获异常
    目录1.警告不是异常2.警告能捕获吗3.捕获警告方法一4.捕获警告方法二5.捕获警告方法三1. 警告不是异常 你是不是经常在使用一些系统库或者第三方模块的时候,会出现一些既不是异常也...
    99+
    2024-04-02
  • React如何优雅的捕获异常
    目录前言 ErrorBoundary Error Boundary 之外 try/catch window.onerror , error事件 unhandledrejection ...
    99+
    2024-04-02
  • 如何动态捕获Python异常
    如何动态捕获Python异常,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在讨论动态捕获异常时让我大吃一惊的是,可以让我找到隐藏的Bug和乐趣。有问题的代码下面...
    99+
    2023-06-17
  • java捕获oracle主键重复异常如何解决
    在Java中,可以使用try-catch语句来捕获Oracle主键重复异常。当执行插入操作时,如果遇到主键重复,Oracle会抛出一...
    99+
    2023-10-18
    java oracle
  • JavaScript try...catch语句:错误捕捉的救星,让你的代码无惧异常
    try...catch语句的语法 try { // 要执行的代码 } catch (error) { // 当try块中发生错误时要执行的代码 } finally { // 无论try块或catch块是否执行,此块代码始终执行...
    99+
    2024-02-23
    JavaScript 异常处理 错误处理 try...catch catch子句 finally子句。
  • 异常处理:PHP中如何捕获和处理异常?
    异常处理:PHP中如何捕获和处理异常?在PHP开发中,异常处理是非常重要的一环。当程序发生意外情况或错误时,我们需要通过捕获和处理异常来保证程序的正常运行。PHP中提供了一套异常处理的机制,本文将介绍如何在PHP中捕获和处理异常,并提供具体...
    99+
    2023-12-18
    捕获 处理 异常
  • python捕获异常的方法是什么
    在Python中,可以使用try-except语句来捕获异常。 语法如下: try: # 可能会产生异常的代码块 excep...
    99+
    2023-10-26
    python
  • PHP 中如何处理未捕获的异常?
    php 中处理未捕获的异常主要有两种方法:使用 set_exception_handler() 函数指定一个异常处理函数。注册 error_handler() 函数,它可以在未捕获的异常...
    99+
    2024-05-10
    php 异常
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作