CN108345542B - 一种应用程序中异常处理方法及装置 - Google Patents
一种应用程序中异常处理方法及装置 Download PDFInfo
- Publication number
- CN108345542B CN108345542B CN201810166293.9A CN201810166293A CN108345542B CN 108345542 B CN108345542 B CN 108345542B CN 201810166293 A CN201810166293 A CN 201810166293A CN 108345542 B CN108345542 B CN 108345542B
- Authority
- CN
- China
- Prior art keywords
- exception
- preset
- captured
- target code
- application program
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/366—Software debugging using diagnostics
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3644—Software debugging by instrumenting at runtime
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
- Stored Programmes (AREA)
Abstract
本发明涉及计算机技术领域,尤其涉及一种应用程序中异常处理方法及装置,该方法为,触发调用预设的异常处理逻辑时,获取在预设的目标代码位置处被捕获的异常;其中,预设的异常处理逻辑是在应用程序编译过程中,织入到应用程序的字节码文件中预设的目标代码位置中的;若确定被捕获的异常不是预设的可忽略异常,则将被捕获的异常抛出,并获得被捕获的异常抛出时生成的异常信息;根据异常信息,对被捕获的异常进行处理,这样,实现了在应用程序开发过程中,尽可能地将crash问题放大,将被捕获的异常重新抛出,防止开发人员过分依赖异常捕获逻辑导致本应该在开发过程中暴露的异常问题无法及时被发现并解决的情况,提高了开发的效率。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及一种应用程序中异常处理方法及装置。
背景技术
针对安卓(Android)的开发环境,通常采用java语言,会利用java的异常机制,将程序运行过程中的异常情况抛出交由调用方处理,但是如果调用方没有处理异常,则会导致程序崩溃(crash)。
因此,现有技术中,根据防御式编程思想,在开发过程中,需要对这种调用方没有处理的异常增加异常捕获语句,同时异常捕获语句也可以解决许多Android系统本身兼容性问题导致的程序crash。
但是,过度地使用异常捕获语句,会导致一些本来可以在开发过程中避免或是解决的crash问题,在开发过程中编程时被忽略了,可能会使得本来存在的逻辑问题被隐藏,进而导致在实际产品运行时出现运行异常情况,降低了用户体验,也增加了开发人员的维护工作量,降低开发的效率和有效性。
发明内容
本发明实施例提供一种应用程序中异常处理方法及装置,以解决现有技术中对异常的处理导致本可以在开发过程中解决的异常被忽略,降低了开发的效率和有效性的问题。
本发明实施例提供的具体技术方案如下:
根据本发明实施例的第一方面,提供了一种应用程序中异常处理方法,包括:
触发调用预设的异常处理逻辑时,获取在预设的目标代码位置处被捕获的异常;其中,所述预设的异常处理逻辑是在所述应用程序编译过程中,织入到所述应用程序的字节码文件中所述预设的目标代码位置中的;
若确定所述被捕获的异常不是预设的可忽略异常,则将所述被捕获的异常抛出,并获得所述被捕获的异常抛出时生成的异常信息;
根据所述异常信息,对所述被捕获的异常进行处理。
结合本发明实施例的第一方面,触发调用预设的异常处理逻辑之前,进一步包括:确定所述预设的异常处理逻辑对应的运行期的控制开关开启。这样,提供了控制开关,可以根据实际需求确定是否开启该控制开关,在控制开关开启时才调用异常处理逻辑,提高了灵活性和用户的可控性。
结合本发明实施例的第一方面,确定所述被捕获的异常不是预设的可忽略异常,具体包括:获取所述被捕获的异常的类名和实例;根据预设的白名单,判断所述被捕获的异常的类名和实例是否在所述预设的白名单中,若确定在,则确定所述被捕获的异常为可忽略异常,若确定不在,则确定所述被捕获的异常不是预设的可忽略异常,其中,所述预设的白名单中至少包括预设的可忽略异常列表。这样,设置白名单,通过白名单进行校验,确定是否将被捕获的异常抛出,提高了可行性和效率。
结合本发明实施例的第一方面,所述字节码文件,为Android系统中所述应用程序的.class文件。
结合本发明实施例的第一方面,所述预设的目标代码位置的确定方式为:根据预设的正则表达式匹配规则,在所述应用程序的字节码文件中查找所述预设的目标代码位置,其中,所述预设的正则表达式匹配规则,是根据预设的出现异常的代码的特征进行设置的。
结合本发明实施例的第一方面,所述预设的目标代码位置为Android系统中的异常捕获语句块所在的位置。
根据本发明实施例的第二方面,提供了一种应用程序中异常处理装置,包括:
获取模块,用于触发调用预设的异常处理逻辑时,获取在预设的目标代码位置处被捕获的异常;其中,所述预设的异常处理逻辑是在所述应用程序编译过程中,织入到所述应用程序的字节码文件中所述预设的目标代码位置中的;
异常抛出模块,用于若确定所述被捕获的异常不是预设的可忽略异常,则将所述被捕获的异常抛出,并获得所述被捕获的异常抛出时生成的异常信息;
处理模块,用于根据所述异常信息,对所述被捕获的异常进行处理。
结合本发明实施例的第二方面,触发调用预设的异常处理逻辑之前,进一步包括:第一确定模块,用于确定所述预设的异常处理逻辑对应的运行期的控制开关开启。
结合本发明实施例的第二方面,确定所述被捕获的异常不是预设的可忽略异常,所述异常抛出模块具体用于:获取所述被捕获的异常的类名和实例;根据预设的白名单,判断所述被捕获的异常的类名和实例是否在所述预设的白名单中,若确定在,则确定所述被捕获的异常为可忽略异常,若确定不在,则确定所述被捕获的异常不是预设的可忽略异常,其中,所述预设的白名单中至少包括预设的可忽略异常列表。
结合本发明实施例的第二方面,所述字节码文件,为Android系统中所述应用程序的.class文件。
结合本发明实施例的第二方面,进一步包括:第二确定模块,用于:根据预设的正则表达式匹配规则,在所述应用程序的字节码文件中查找所述预设的目标代码位置,其中,所述预设的正则表达式匹配规则,是根据预设的出现异常的代码的特征进行设置的。
结合本发明实施例的第二方面,所述预设的目标代码位置为Android系统中的异常捕获语句块所在的位置。
根据本发明实施例的第三方面,提供了一种计算机装置,包括:
至少一个存储器,用于存储程序指令;
至少一个处理器,用于调用所述存储器中存储的程序指令,按照获得的程序指令执行本发明实施例中的应用程序中异常处理方法。
根据本发明实施例的第四方面,提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述任一种应用程序中异常处理方法的步骤。
本发明实施例中,触发调用预设的异常处理逻辑时,获取在预设的目标代码位置处被捕获的异常;其中,所述预设的异常处理逻辑是在所述应用程序编译过程中,织入到所述应用程序的字节码文件中所述预设的目标代码位置中的;若确定所述被捕获的异常不是预设的可忽略异常,则将所述被捕获的异常抛出,并获得所述被捕获的异常抛出时生成的异常信息;根据所述异常信息,对所述被捕获的异常进行处理,这样,在编译过程中织入异常处理逻辑,运行调用该异常处理逻辑时,可以将被捕获或保护的异常重新暴露出来,实现了在应用程序开发过程中,尽可能地将crash问题放大,提醒开发过程中容易忽略的异常,避免本应该在开发过程中暴露的异常问题无法及时被发现并解决的问题,使得开发人员可以在开发阶段就可以发现并解决更多的异常,减少了开发人员的维护工作量,也提高了开发的效率和有效性,并且,本发明实施例中,可以通过查找目标代码的位置,自动织入异常处理逻辑,无需修改程序现有的逻辑,实现了非侵入式的进攻式编程思想。
附图说明
图1为本发明实施例中一种应用程序中异常处理方法的流程图;
图2为本发明实施例中具体应用场景中应用程序中异常处理执行过程示意图;
图3为本发明实施例中通过白名单对被捕获的异常进行校验的执行过程流程图;
图4为本发明实施例中在编译过程中异常处理逻辑织入的执行过程示意图;
图5为本发明实施例中应用程序中异常处理装置结构示意图;
图6为本发明实施例中计算机装置结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,并不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
为便于对本发明实施例的理解,下面先对几个概念进行简单介绍:
非侵入式编程:非侵入式的代码则没有过多的依赖,可以很方便的迁移到其他地方。
侵入式编程:让用户代码产生对框架的依赖,这些代码不能在框架外使用,不利于代码的复用。
进攻式编程:主动暴露可能出现的错误,在开发阶段让它显现出来,而在产品代码运行时让它能够自我恢复。
面向切面编程(Aspect Oriented Programming,AOP):通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是面向对象编程(Object OrientedProgramming,OOP)的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
AspectJ:AspectJ是一个AOP的框架,它扩展了Java语言,也是可以在安卓(Android)中实现AOP的框架之一。
崩溃(crash):程序运行过程中异常中断。
实例:“类”在实例化之后叫做一个“实例”,实例和对象基本上是同义词,对象代表了类的一个特定的实例,实例是对象的具体表示,操作可以作用于实例,实例可以有状态地存储操作结果。
在实际编码过程中,为保证应用程序的可用性和可靠性,通常对于外发版本采用防御性编程思想,对于开发版本采用进攻式编程思想。本发明实施例中,主要针对Android应用开发环境,对于应用开发过程中的crash问题,现有技术中,主要是采用防御性编程思想,使用异常捕获语句,例如try catch语句块,将应用开发过程中的异常捕获,这点不符合进攻式编程思想。并且,虽然使用异常捕获语句,可以解决应用开发过程中的crash问题,但是,过度地使用异常捕获语句,也会导致本可以在开发过程中被解决的问题,反而被忽略了,降低了应用程序开发的有效性。
例如,一个应用程序开发完成并发布给用户,若用户在运行该应用程序时发生crash问题,则一方面不利于用户体验,另一方面开发人员再通过从用户端获取这些crash信息来解决crash问题,比较麻烦,也不方便,降低了效率和有效性,因此,本发明实施例中,采用进攻式编程思想,尽可能地在开发过程中将crash问题放大,以便开发人员能够在应用开发过程中解决更多的crash问题。
并且,对于进攻式编程思想,现有技术中主要是通过定义统一的框架来实现,在不同的代码中,使用统一的框架代码,但是,这种方式:1)接入成本大。在项目初期,接入这一套统一的框架代码成本不大,但是到了项目成型之后,整个项目中的异常捕获逻辑非常多,接入一套统一的框架代码会非常耗时。2)属于侵入式。接入框架代码需要改变项目程序代码的现有逻辑,会让现有逻辑对框架有依赖,虽然更灵活,但是不方便迁移、也不方便其他业务接入。而且由于涉及到crash问题,如果框架本身有问题,会导致应用程序不稳定,侵入式的框架接入存在一定风险。3)难以统一控制。由于定义了统一的框架,就需要所有的使用方都需遵守框架里的规则,不方便全局统一的控制,在多人协作开发中,也容易出现纰漏。
因此,本发明实施例中,主要是采用非侵入式AOP技术,来实现进攻式编程思想,不需要改变现有的编码逻辑,接入方便。
如图1所示,本发明实施例中的应用程序中异常处理方法,具体包括以下步骤:
步骤100:在应用程序编译过程中,获取编译的字节码文件,并在字节码文件中预设的目标代码位置中织入预设的异常处理逻辑。
本发明实施例中,例如,采用AspectJ框架实现AOP技术,针对开发版本,在Android应用程序编译过程中,利用AspectJ,织入预设的异常处理逻辑。
其中,字节码文件为java编译的.class文件。在编译后的.class文件织入预设的异常处理逻辑,得到织入后的新的.class文件。
其中,预设的目标代码位置,例如为Android系统中的异常捕获语句块所在的位置,即try catch语句块,由于java代码中,try catch语句块位置通常可能会发生异常,trycatch语句块会将发生的异常捕获,捕获即是将异常抓住,不进行抛出,因此捕获住的异常不会影响程序的正常运行。本发明实施例中,可以将被try catch住的异常再进行判断,确定是否抛出。
并且,本发明实施例中,可以实现自动查找预设的目标代码位置,并进行织入,在查找目标代码位置时,提供了一种可能的实施例方式,可以根据设置的正则表达式匹配规则,在应用程序的字节码文件中查找预设的目标代码位置。
其中,预设的正则表达式匹配规则,是根据预设的出现异常的代码的特征进行设置的,本发明实施例中,目标代码位置,并不仅限于是try catch语句块,开发人员可以根据实际经验,确定可能出现异常的目标代码位置,并根据可能出现异常的目标代码位置的特征,设置正则表达式匹配规则,从而可以使得能够根据设置的正则表达式匹配规则,自动在需要异常处理的位置织入预设的异常处理逻辑。
步骤110:触发调用预设的异常处理逻辑时,获取在预设的目标代码位置处被捕获的异常。
其中,可以获取到被捕获的异常的参数信息,包括类名、实例等。这里的被捕获的异常表示可以使用try catch语句块捕获的异常。
进一步地,为提高灵活和可控性,本发明实施例中提供了一种可能的实施例方式,提供异常处理逻辑对应的运行期的控制开关,在执行步骤110时,判断运行期的控制开关是否开启,若确定关闭,则结束,对被捕获的异常不进行处理,若确定开启,则执行步骤110,获取被捕获的异常,并进行处理。这样,开发人员可以根据实际需求确定打开或关闭控制开关,方便开发人员统一进行控制。
步骤120:若确定所述被捕获的异常不是预设的可忽略异常,则将所述被捕获的异常抛出,并获得所述被捕获的异常抛出时生成的异常信息。
其中,可忽略异常表示不需要处理的异常,这些异常也不会影响应用程序在用户端的正常运行和使用,开发人员可以根据实际需求和情况进行预先设置。
在执行步骤120时,本发明实施例中提供了一种可能的实施方式,预先设置白名单,获取被捕获的异常的类名和实例,根据预设的白名单,判断被捕获的异常的类名和实例是否在白名单中,若确定在,则确定被捕获的异常为可忽略异常,过滤掉该被捕获的异常,若确定不在,则将被捕获的异常再次抛出,获得异常再次抛出时生成的异常信息。
其中,白名单中包括预设的可忽略异常列表,并且可以划分了两级,第一级为可忽略异常的类名,第二级为可忽略异常的实例,每个类名下可能会包括多个实例。这样,通过白名单进行判断时,可以先判断类名,再判断该类名对应的实例。
步骤130:根据所述异常信息,对所述被捕获的异常进行处理。
本发明实施例中,在将被捕获的异常抛出时,必然会导致程序crash,对于Android应用开发环境,程序crash时,会自动生成异常信息,其中,异常信息可以包括发生异常的位置、时间等,从而可以根据这些异常信息对该被捕获的异常进行处理。
当然,本发明实施例中的异常处理方法,并不仅限于Android应用开发过程,还可以应用于其它应用开发环境,对此并不进行限制。
本发明实施例中,通过在编译过程中,织入预设的异常处理逻辑,在运行期,获取被捕获的异常,并进行判断,若确定被捕获的异常不是预设的可忽略异常,则将被捕获的异常抛出,并获得被捕获的异常抛出时生成的异常信息,对该被捕获的异常进行处理,这样,可以在开发过程中,将被捕获或保护的异常重新暴露出来,防止开发人员太过依赖异常捕获逻辑,导致本应该在开发过程中暴露的异常问题无法及时被发现并解决,进而导致在实际产品运行时出现运行异常情况,尽可能地在开发过程中将crash问题放大,提醒开发过程中容易忽略的异常,并且可以方便定位这些异常,以便开发人员能够在应用开发过程中解决更多的crash问题,并且,本发明实施例中,可以通过查找目标代码的位置,自动织入异常处理逻辑,无需修改程序现有的逻辑,实现了非侵入式的进攻式编程思想。
下面以使用AspectJ对Android应用程序进行异常处理为例,对上述实施例进行详细说明,具体的可以分为以下几个方面:
1)编译期织入。
本发明实施例中,采用AspectJ技术,对Android应用程序源码编译的.class文件进行处理,在具体实现时可以使用groovy语言实现。在Android应用程序编译中集成AspectJ,主要利用了AspectJ编译器(The AspectJ compiler,Ajc)。其中,Ajc是AspectJ自带的命令工具,用于编译和组织AspectJ代码、java代码和.class文件。
其中,对Android应用程序源码进行编译时,可以使用gradle脚本。其中,gradle是google官方推荐的构建工具,构建灵活,支持扩展命令。并且,gradle编译java代码时,本身提供了JavaCompile任务,gradle任务中的doLast方法也可以在JavaCompile结束后,执行任意所需要的命令。而且doLast方法是一个任务队列,因此可以避免任务冲突的问题。将AspectJ的AspectJtools jar包引入到该Android应用程序中,Ajc本身是一个java的程序命令,可以处理JavaCompile完后得到的.class文件,因此,通过调用Main.run()方法,即可将需要处理的程序代码在编译期织入。
2)AspectJ织入逻辑块。
为便于理解AspectJ织入逻辑块,下面先简单介绍下AOP相关的术语:
(1)Cross-cutting concerns(横切关注点):尽管面向对象模型中大多数类会实现单一特定的功能,但通常也会开放一些通用的附属功能给其他类。例如,若在数据访问层中的类中添加日志,同时在当UI层中一个线程进入或者退出调用一个方法时添加日志。尽管每个类都有一个区别于其他类的主要功能,但在代码里,仍然经常需要添加一些相同的附属功能。
(2)advice(通知):注入到.class文件中的代码,advice类型通常有before、after和around,分别表示在目标方法执行之前、执行后和完全替代目标方法执行的代码。除了可以在目标方法中织入代码,也可能会对目标代码做其它修改,例如在一个class中增加字段或者接口。其中,AspectJ支持的advice有:before(),表示before advice;after(),表示after advice等。
(3)JointPoint(连接点):可能作为自定义代码织入目标代码位置的特定的点,该点能被方法调用而且也会被抛出意外,是应用程序提供给切面插入的地方,在插入地建立AspectJ程序与源程序的连接。其中,AspectJ支持的JointPoint有:method call,表示函数调用;method execution:表示函数执行;handler:表示异常处理等,本发明实施例中就不一一列举了。
(4)Pointcut(切入点):告诉代码织入工具,在何处织入自定义代码的表达式。例如,在哪些JointPoint中应用一个特定的advice。
(5)Aspect(切面):Pointcut和advice的组合可以认为是切面。例如,在应用程序中通过定义一个Pointcut和相应的advice,可以添加一个日志切面。
(6)weaving(织入):注入代码(advice)到目标代码位置(JointPoint)的过程。
AspectJ织入逻辑块,即本发明实施例中的预设的异常处理逻辑,其实现了织入的具体逻辑,AspectJ通过解析AspectJ织入逻辑块,确定预设的目标代码位置,并在预设的目标代码位置中织入,对于AspectJ,是将其通知(advice)中的代码织入到目标代码位置中。
例如,若目标代码为异常捕获语句块,即try catch语句块,则AspectJ的JointPoint的handler可以切入到try catch语句块中,查找.class文件中所有的trycatch语句块,在before advice中插入自定义代码,对被捕获的异常进行判断处理,其中handler只支持before advice。
在具体实现时,AspectJ支持AspectJ语言和Annotation两种方式,由于Annotation是java语言,对Android的支持比AspectJ语言更好,因此,本发明实施例中采用Annotation的方式。在使用Annotation实现时,本发明实施例中Annotation的Pointcut可以定义为:handler(Throwable+)。其中,该Pointcut表示对所有try catch语句块中,参数为Throwable或者Throwable的子类的位置处都进行织入。before advice使用@Before()注解表示。
这样,可以根据定义的Pointcut查找目标代码位置,并根据before advice在目标代码位置处织入自定义代码。
3)runtime依赖模块。
runtime类封装了运行时的环境,在一些编程语言中,把某些可以重用的程序或者实例打包或者重建成为"运行库",这些实例可以在它们运行的时候被链接或者被任何程序调用,因此,本发明实施例中,在runtime依赖模块中包含了运行过程中的依赖逻辑,即本发明实施例中的白名单控制和运行期的控制开关,并且,该runtime依赖模块与应用程序的源码共同进行编译。
具体地:在Annotation的before advice的实现中传入JointPoint实例,通过这个实例的getArgs()方法可以获取被捕获的异常,并且通过getSourceLocation().getWithInType()方法可以获取到被捕获的异常的类名,通过类名和实例配对的方式,对被捕获的异常进行过滤,即通过白名单对被捕获的异常进行校验,若确定在白名单,则确定被捕获的异常为可忽略异常,过滤掉该被捕获的异常,若确定不在白名单,则将被捕获的异常再次抛出,获得异常再次抛出时生成的异常信息,并对该被捕获的异常进行处理。
具体参阅图2所示,为本发明实施例中具体应用场景中应用程序中异常处理执行过程示意图,即本发明实施例中advice的实现部分,具体执行过程如下:
步骤200:截获到JointPoint。
本发明实施例中,JointPoint即表示在应用程序的.class文件中织入异常处理逻辑的连接点,查找到JointPoint就可以表示查找到织入的异常处理逻辑。
步骤201:判断运行期的控制开关是否开启,若是,则执行步骤202,否则,则执行步骤205。
本发明实施例中,提供了控制开关,若控制开关未开启,则不需要对被捕获的异常再次进行处理,还是按照原来try catch的执行方式捕获住即可。
步骤202:获取被捕获的异常的类名和实例。
具体地,即是从JointPoint的方法中获取到出现异常的类名和实例。
步骤203:判断被捕获的异常是否在白名单中,若是,则执行步骤205,否则,则执行步骤204。
也就是说,由于白名单中记录的可忽略的异常,若确定在白名单中,说明被捕获的异常的确是不用处理的,也就不需要再次抛出。
步骤204:将被捕获的异常再次抛出,生成异常信息。
步骤205:结束。
基于上述实施例,对上述步骤203的具体执行过程进行详细说明,具体参阅图3所示,为本发明实施例中通过白名单对被捕获的异常进行校验的执行过程流程图,具体包括:
步骤300:获取被捕获的异常的类名和实例。
步骤301:判断被捕获的异常的类名是否为空,若是,则执行步骤308,否则,则执行步骤302。
步骤302:判断白名单是否为空,若是,则执行步骤308,否则,则执行步骤303。
步骤303:从白名单中取出预设的可忽略的异常列表。
步骤304:判断可忽略的异常列表是否为空,若是,则执行步骤308,否则,则执行步骤305。
步骤305:遍历可忽略的异常列表。
步骤306:判断被捕获的异常的实例是否是可忽略的异常列表中类的实例或是否是可忽略的异常列表中类的子类的实例,若是,则执行步骤307,否则,则执行308。
步骤307:过滤。
即说明被捕获的异常为可忽略的异常,将被捕获的异常过滤掉,可以忽略,不进行抛出。
步骤308:不过滤。
也就是说,被捕获的异常不是可忽略的异常,通过白名单没有过滤掉,需要将该被捕获的异常抛出,从而使得程序crash,生成异常信息,进而根据异常信息,对该被捕获的异常进行处理。
基于上述实施例中,对上述实施例中以使用AspectJ对Android应用程序进行异常处理为例介绍的三个方面,在编译过程中的执行过程进行说明,具体参阅图4所示,为本发明实施例中在编译过程中异常处理逻辑织入的执行过程具体如下:
步骤400:将编译所需文件输入到Java compiler中进行编译。
参阅图4所示,编译所需文件可以包括R.java文件、源码(source code)、java接口(interface)、runtime依赖模块。
步骤401:通过Java compiler进行编译,获得.class文件。
其中,.class文件为java语言中标准的java字节码文件。
步骤402:将.class文件和AspectJ织入逻辑块输入到AspectJ中进行织入。
步骤403:解析AspectJ织入逻辑块,并在.class文件中目标代码位置处织入预设异常处理逻辑。
步骤404:获得织入后的.class文件。
步骤405:对织入后的.class文件输入到dex中进行处理。
步骤406:获得.dex文件。
其中,.dex文件为Android平台上可执行文件的类型。
这样,Android应用开发使用所使用的编程语言是Java语言,编译时将应用程序的Java源程序编程成标准的Java字节码文件,即.class文件,然后,将.class文件转成.dex文件,这样,最后使用Android打包工具就可以将.dex文件和其它文件组合打包成一个应用程序包(APK),该应用程序包就可以发布给个用户端进行运行和使用。由于本发明实施例中,在应用程序的编译期对.class文件进行织入,将被捕获的异常再次抛出,因此,实现了在开发过程中,将crash问题放大,可以保证在开发过程中就可以解决更多的crash问题,这样,最后发布给用户端的应用程序包,可以减少crash问题的出现,提高用户使用体验,也减少开发人员的维护工作量,也提高解决crash问题效率。
当然,本发明实施例中,并不仅限于使用AspectJ框架来实现AOP技术,还可以使用其它可以实现AOP技术的框架,例如,APT、javassist等,本发明实施例中并不进行限制,只要是用于实现本发明实施例中的异常处理方法,都应属于本发明实施例的保护范围。
基于上述实施例,参阅图5所示,本发明实施例中应用程序中异常处理装置,具体包括:
获取模块50,用于触发调用预设的异常处理逻辑时,获取在预设的目标代码位置处被捕获的异常;其中,所述预设的异常处理逻辑是在所述应用程序编译过程中,织入到所述应用程序的字节码文件中所述预设的目标代码位置中的;
异常抛出模块51,用于若确定所述被捕获的异常不是预设的可忽略异常,则将所述被捕获的异常抛出,并获得所述被捕获的异常抛出时生成的异常信息;
处理模块52,用于根据所述异常信息,对所述被捕获的异常进行处理。
可选的,触发调用预设的异常处理逻辑之前,进一步包括:
第一确定模块53,用于确定所述预设的异常处理逻辑对应的运行期的控制开关开启。
可选的,确定所述被捕获的异常不是预设的可忽略异常,所述异常抛出模块51具体用于:
获取所述被捕获的异常的类名和实例;根据预设的白名单,判断所述被捕获的异常的类名和实例是否在所述预设的白名单中,若确定在,则确定所述被捕获的异常为可忽略异常,若确定不在,则确定所述被捕获的异常不是预设的可忽略异常,其中,所述预设的白名单中至少包括预设的可忽略异常列表。
可选的,进一步包括:第二确定模块54,用于:根据预设的正则表达式匹配规则,在所述应用程序的字节码文件中查找所述预设的目标代码位置,其中,所述预设的正则表达式匹配规则,是根据预设的出现异常的代码的特征进行设置的。
可选的,所述字节码文件,为Android系统中所述应用程序的.class文件。
可选的,所述预设的目标代码位置为Android系统中的异常捕获语句块所在的位置。
基于上述实施例,参阅图6所示,本发明实施例中,一种计算机装置的结构示意图。
本发明实施例提供了一种计算机装置,该计算机装置可以包括处理器610(CenterProcessing Unit,CPU)、存储器620、输入设备630和输出设备640等,输入设备630可以包括键盘、鼠标、触摸屏等,输出设备640可以包括显示设备,如液晶显示器(Liquid CrystalDisplay,LCD)、阴极射线管(Cathode Ray Tube,CRT)等。
存储器620可以包括只读存储器(ROM)和随机存取存储器(RAM),并向处理器610提供存储器620中存储的程序指令和数据。在本发明实施例中,存储器620可以用于存储上述实施例中的应用程序中异常处理方法的程序。
处理器610通过调用存储器620存储的程序指令,处理器610用于按照获得的程序指令执行:
触发调用预设的异常处理逻辑时,获取在预设的目标代码位置处被捕获的异常;其中,所述预设的异常处理逻辑是在所述应用程序编译过程中,织入到所述应用程序的字节码文件中所述预设的目标代码位置中的;
若确定所述被捕获的异常不是预设的可忽略异常,则将所述被捕获的异常抛出,并获得所述被捕获的异常抛出时生成的异常信息;
根据所述异常信息,对所述被捕获的异常进行处理。
可选的,触发调用预设的异常处理逻辑之前,处理器610进一步用于:确定所述预设的异常处理逻辑对应的运行期的控制开关开启。这样,提供了控制开关,可以根据实际需求确定是否开启该控制开关,在控制开关开启时才调用异常处理逻辑,提高了灵活性和用户的可控性。
可选的,确定所述被捕获的异常不是预设的可忽略异常,处理器610具体用于:获取所述被捕获的异常的类名和实例;根据预设的白名单,判断所述被捕获的异常的类名和实例是否在所述预设的白名单中,若确定在,则确定所述被捕获的异常为可忽略异常,若确定不在,则确定所述被捕获的异常不是预设的可忽略异常,其中,所述预设的白名单中至少包括预设的可忽略异常列表。这样,设置白名单,通过白名单进行校验,确定是否将被捕获的异常抛出,提高了可行性和效率。
基于上述实施例,本发明实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述任意方法实施例中的应用程序中异常处理方法。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明实施例进行各种改动和变型而不脱离本发明实施例的精神和范围。这样,倘若本发明实施例的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
Claims (7)
1.一种应用程序中异常处理方法,其特征在于,包括:
确定预设的异常处理逻辑对应的运行期的控制开关开启,并触发调用预设的异常处理逻辑时,获取在预设的目标代码位置处被异常捕获语句块捕获的异常,以使得通过所述目标代码位置便于定位被异常捕获语句块捕获的异常;其中,被异常捕获语句块捕获的异常表征出现异常但被捕获而未导致所述应用程序异常并未生成异常信息;所述预设的异常处理逻辑是在所述应用程序编译过程中,自动查找预设的目标代码位置,并织入到所述应用程序的字节码文件中所述预设的目标代码位置中的,所述预设的目标代码位置为异常捕获语句块所在的位置,所述异常捕获语句块为try catch语句块;
若确定所述被捕获的异常不是预设的可忽略异常,则将所述被捕获的异常再次抛出,并获得所述被捕获的异常再次抛出时生成的异常信息;
根据所述异常信息,对所述被捕获的异常进行处理。
2.如权利要求1所述的方法,其特征在于,确定所述被捕获的异常不是预设的可忽略异常,具体包括:
获取所述被捕获的异常的类名和实例;
根据预设的白名单,判断所述被捕获的异常的类名和实例是否在所述预设的白名单中,若确定在,则确定所述被捕获的异常为可忽略异常,若确定不在,则确定所述被捕获的异常不是预设的可忽略异常,其中,所述预设的白名单中至少包括预设的可忽略异常列表。
3.如权利要求1所述的方法,其特征在于,所述预设的目标代码位置的确定方式为:
根据预设的正则表达式匹配规则,在所述应用程序的字节码文件中查找所述预设的目标代码位置,其中,所述预设的正则表达式匹配规则,是根据预设的出现异常的代码的特征进行设置的。
4.一种应用程序中异常处理装置,其特征在于,包括:
获取模块,用于触发调用预设的异常处理逻辑时,获取在预设的目标代码位置处被异常捕获语句块捕获的异常,以使得通过所述目标代码位置便于定位被异常捕获语句块捕获的异常;其中,被异常捕获语句块捕获的异常表征出现异常但被捕获而未导致所述应用程序异常并未生成异常信息;所述预设的异常处理逻辑是在所述应用程序编译过程中,自动查找预设的目标代码位置,并织入到所述应用程序的字节码文件中所述预设的目标代码位置中的,所述预设的目标代码位置为异常捕获语句块所在的位置,所述异常捕获语句块为try catch语句块;
第一确定模块,用于在所述获取模块触发调用预设的异常处理逻辑之前,确定所述预设的异常处理逻辑对应的运行期的控制开关开启;
异常抛出模块,用于若确定所述被捕获的异常不是预设的可忽略异常,则将所述被捕获的异常再次抛出,并获得所述被捕获的异常再次抛出时生成的异常信息;
处理模块,用于根据所述异常信息,对所述被捕获的异常进行处理。
5.如权利要求4所述的装置,其特征在于,确定所述被捕获的异常不是预设的可忽略异常,所述异常抛出模块具体用于:
获取所述被捕获的异常的类名和实例;
根据预设的白名单,判断所述被捕获的异常的类名和实例是否在所述预设的白名单中,若确定在,则确定所述被捕获的异常为可忽略异常,若确定不在,则确定所述被捕获的异常不是预设的可忽略异常,其中,所述预设的白名单中至少包括预设的可忽略异常列表。
6.如权利要求4所述的装置,其特征在于,进一步包括:第二确定模块,用于:根据预设的正则表达式匹配规则,在所述应用程序的字节码文件中查找所述预设的目标代码位置,其中,所述预设的正则表达式匹配规则,是根据预设的出现异常的代码的特征进行设置的。
7.一种计算机可读存储介质,其上存储有计算机程序,其特征在于:所述计算机程序被处理器执行时实现权利要求1-3任一项所述方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810166293.9A CN108345542B (zh) | 2018-02-28 | 2018-02-28 | 一种应用程序中异常处理方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810166293.9A CN108345542B (zh) | 2018-02-28 | 2018-02-28 | 一种应用程序中异常处理方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108345542A CN108345542A (zh) | 2018-07-31 |
CN108345542B true CN108345542B (zh) | 2021-01-29 |
Family
ID=62959036
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810166293.9A Active CN108345542B (zh) | 2018-02-28 | 2018-02-28 | 一种应用程序中异常处理方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108345542B (zh) |
Families Citing this family (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110806968B (zh) * | 2018-08-06 | 2024-04-09 | 阿里巴巴集团控股有限公司 | 应用程序运行信息获取方法及装置 |
CN109408261B (zh) * | 2018-09-26 | 2023-06-20 | 中国平安财产保险股份有限公司 | 应用程序崩溃处理方法、装置、计算机设备和存储介质 |
CN109522222A (zh) * | 2018-10-26 | 2019-03-26 | 深圳点猫科技有限公司 | 一种用于教育云平台的异常捕获方法及装置 |
CN109508249B (zh) * | 2018-11-15 | 2022-05-31 | 厦门美图之家科技有限公司 | 崩溃处理方法、装置及电子设备 |
CN111597093B (zh) * | 2019-02-20 | 2024-04-16 | 阿里巴巴集团控股有限公司 | 一种异常处理方法、装置及其设备 |
CN111831464A (zh) * | 2019-04-22 | 2020-10-27 | 阿里巴巴集团控股有限公司 | 数据操作的控制方法及装置 |
CN110764776A (zh) * | 2019-09-24 | 2020-02-07 | 中信百信银行股份有限公司 | 依赖组件管控方法和装置 |
CN113010401A (zh) * | 2019-12-19 | 2021-06-22 | 广州凡科互联网科技股份有限公司 | 一种基于ssm系统的异常捕获处理方法 |
CN111444065B (zh) * | 2020-05-18 | 2022-03-11 | 江苏电力信息技术有限公司 | 一种基于AspectJ的移动端性能指标监控方法 |
CN111708655A (zh) * | 2020-06-19 | 2020-09-25 | 北京达佳互联信息技术有限公司 | 一种应用程序崩溃处理方法、装置及系统 |
CN112328497A (zh) * | 2020-11-27 | 2021-02-05 | 四川长虹电器股份有限公司 | Java异常处理方法 |
CN112667511A (zh) * | 2020-12-30 | 2021-04-16 | 广州凡科互联网科技股份有限公司 | 一种通过插入代码来追踪java程序内部调用链的方法 |
CN113126971A (zh) * | 2021-04-07 | 2021-07-16 | 粒子文化科技集团(杭州)股份有限公司 | 数据埋点的处理方法、装置、系统、电子装置和存储介质 |
CN113297149A (zh) * | 2021-06-21 | 2021-08-24 | 中国农业银行股份有限公司 | 数据处理请求的监测方法及装置 |
CN114020352B (zh) * | 2021-10-27 | 2023-09-15 | 郑州云海信息技术有限公司 | 一种云平台配置方法、装置、设备以及存储介质 |
CN113900851A (zh) * | 2021-10-29 | 2022-01-07 | 广州品唯软件有限公司 | 一种安卓应用软件控制方法及装置 |
CN114416412A (zh) * | 2022-01-14 | 2022-04-29 | 建信金融科技有限责任公司 | 一种基于Arthas的异常定位方法及系统 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6412109B1 (en) * | 1999-01-29 | 2002-06-25 | Sun Microsystems, Inc. | Method for optimizing java bytecodes in the presence of try-catch blocks |
CN101599039A (zh) * | 2008-06-03 | 2009-12-09 | 华为技术有限公司 | 嵌入式c语言环境下异常处理方法及装置 |
CN104331367A (zh) * | 2014-11-12 | 2015-02-04 | 浪潮(北京)电子信息产业有限公司 | Java工程项目开发中异常处理的方法及系统 |
CN106990955A (zh) * | 2017-03-09 | 2017-07-28 | 武汉斗鱼网络科技有限公司 | 一种对应用程序进行打点的方法和系统 |
-
2018
- 2018-02-28 CN CN201810166293.9A patent/CN108345542B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6412109B1 (en) * | 1999-01-29 | 2002-06-25 | Sun Microsystems, Inc. | Method for optimizing java bytecodes in the presence of try-catch blocks |
CN101599039A (zh) * | 2008-06-03 | 2009-12-09 | 华为技术有限公司 | 嵌入式c语言环境下异常处理方法及装置 |
CN104331367A (zh) * | 2014-11-12 | 2015-02-04 | 浪潮(北京)电子信息产业有限公司 | Java工程项目开发中异常处理的方法及系统 |
CN106990955A (zh) * | 2017-03-09 | 2017-07-28 | 武汉斗鱼网络科技有限公司 | 一种对应用程序进行打点的方法和系统 |
Also Published As
Publication number | Publication date |
---|---|
CN108345542A (zh) | 2018-07-31 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108345542B (zh) | 一种应用程序中异常处理方法及装置 | |
Lin et al. | Retrofitting concurrency for android applications through refactoring | |
US7761855B2 (en) | Computer program product and system for altering execution flow of a computer program | |
US10528330B2 (en) | System and method for supporting compatibility checking for lambda expression | |
US8402428B2 (en) | Method and apparatus for automatically generating source code files in a file storage unit | |
US8782607B2 (en) | Contract failure behavior with escalation policy | |
Pukall et al. | JavAdaptor—Flexible runtime updates of Java applications | |
US20090307652A1 (en) | Automatic model-specific debugger extensions | |
US8141035B2 (en) | Method for accessing internal states of objects in object oriented programming | |
CN111176722B (zh) | 第三方库的文件版本检测方法、装置及存储介质 | |
US9367429B2 (en) | Diagnostics of declarative source elements | |
EP3752945A1 (en) | Automatic generation of patches for security violations | |
Weinberger et al. | Google C++ style guide | |
Riganelli et al. | Controlling interactions with libraries in android apps through runtime enforcement | |
US8375443B1 (en) | Code annotations for preventing access to unsafe functionality | |
CN111880804A (zh) | 应用程序代码的处理方法及装置 | |
WO2014028784A1 (en) | Imperative attribution for elements in managed runtimes | |
JP2004094374A (ja) | ロギングシステム | |
Dietrich et al. | Driver generation for java ee web applications | |
Toffalini et al. | Practical static analysis of context leaks in Android applications | |
Lawall et al. | Tarantula: Killing driver bugs before they hatch | |
Hlopko et al. | On the integration of Smalltalk and Java: practical experience with STX: LIBJAVA | |
EP3033674B1 (en) | Runtime memory throttling | |
Toffalini et al. | Static analysis of context leaks in android applications | |
Lin | Automated refactoring for Java concurrency |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |