首页> 中国专利> 基于Python的异常捕获方法、装置及计算机可读存储介质

基于Python的异常捕获方法、装置及计算机可读存储介质

摘要

本发明提供了基于Python的异常捕获方法、装置及计算机可读存储介质,属于计算机软件的技术领域,解决现有捕获异常方案中容易遗漏代码,适用范围有限,进程崩溃时无法捕获,无法应对常见的内存溢出的问题场景的问题。包括构建全局异常捕获函数;在Python库thread源码中修改对默认全局异常和用户自定义全局异常的判定;调用全局异常捕获函数对异常信息进行捕获。本发明通过构造全局异常钩子函数和增加try/catch代码块来捕获普通异常和进程崩溃,通过构建内存监控子线程对内存溢出类异常提前预警并记录信息,便于查看一段时间内环境变化,追踪问题根源,在记录信息时通过运用修饰符函数构建可执行的脚本供研发人员快速复现问题。

著录项

  • 公开/公告号CN112181815A

    专利类型发明专利

  • 公开/公告日2021-01-05

    原文格式PDF

  • 申请/专利权人 苏州浪潮智能科技有限公司;

    申请/专利号CN202010992098.9

  • 发明设计人 刘超;邓淮谦;

    申请日2020-09-21

  • 分类号G06F11/36(20060101);G06F11/30(20060101);

  • 代理机构11570 北京众达德权知识产权代理有限公司;

  • 代理人詹守琴

  • 地址 215000 江苏省苏州市吴中经济开发区郭巷街道官浦路1号9幢

  • 入库时间 2023-06-19 09:26:02

说明书

技术领域

本发明涉及计算机软件技术领域,尤其是涉及一种基于Python的异常捕获方法、装置及计算机可读存储介质。

背景技术

随着Python编程语言功能的不断完善和发展,基于Python编程语言开发的应用程序越来越多。在Python应用程序因异常退出时,研发人员为定位问题原因需要搜集程序错误信息,进而进行问题复现。现有的搜集错误信息的方式是查找程序发生异常时的记录,该记录包含异常发生时刻的环境信息,该信息对定位普通异常问题有效,但是该记录缺乏异常发生之前一段时间内的相关数据,无法定位复杂异常问题,尤其是常见的因内存溢出导致的程序崩溃,因为对于内存溢出时刻系统几乎无可用内存,现有程序中捕获异常模块很难申请到系统资源去记录异常发生时刻的错误信息,往往导致无错误信息可查。再者,现有的记录方式只是单纯记录软件错误信息,开发人员还要根据这些信息去反推用户操作,尝试复现步骤去构造问题发生时刻的系统环境,定位问题效率很低。

现有的基于Python的异常捕获方式或是在程序中增加try/catch代码块来捕获异常,或是通过监控脚本异常信号。在捕获异常之后,记录异常发生时的环境信息,比如异常类型和软件异常时的业务数据等。

对于在程序中增加try/catch代码块来捕获异常的方式,如果有代码或功能漏加,则该处代码或功能出现异常时便无法捕获,当进程崩溃时也无法及时捕获。而监控脚本异常信号的方式应用范围有限,适合调用独立测试脚本的场景。与此同时,现有捕获异常记录信息的方式仅包含异常发生时刻的环境信息,对定位普通异常问题有效,但是缺乏异常发生之前一段时间内的相关数据,无法定位复杂异常问题,尤其是常见的因内存溢出导致的程序崩溃,因为内存溢出时刻系统几乎无可用内存,现有程序中捕获异常模块很难申请到系统资源去记录异常发生时刻的错误信息,往往导致无错误信息可查。再者,现有的记录方式只是单纯记录软件错误信息,开发人员还要根据这些信息去反推用户操作,尝试复现步骤去构造问题发生时刻的系统环境,定位效率很低。

发明内容

本发明的目的在于提供基于Python的异常捕获方法、装置及计算机可读存储介质,解决了现有捕获异常方案中容易遗漏代码,适用范围有限,进程崩溃时无法捕获,无法应对常见的内存溢出的场景,且记录的信息非常有限,开发人员只能根据有限信息复现问题,复现难度大,定位效率低的技术问题。

第一方面,本发明提供的一种基于Python的异常捕获方法,包括:

构建全局异常捕获函数,对系统异常进行实时捕获;

在Python库thread源码中修改对默认全局异常和用户自定义全局异常的判定;

当系统发生异常时,调用全局异常捕获函数对异常信息进行捕获,记录当前系统环境并生成异常信息记录。

进一步的,构建全局异常捕获函数的步骤,包括:

构建全局异常钩子函数和构建try/catch代码块;

定义全局异常捕获函数;

将所述全局异常捕获函数与所述全局异常钩子函数进行关联。

进一步的,还包括:

构建内存监控线程,对目标进程的内存进行实时监控;

当内存占用量或内存増量率超出异常门限时,记录当前系统环境并生成异常信息记录。

进一步的,构建内存监控线程,对目标进程的内存进行实时监控的步骤,包括:

构建内存监控线程;

利用memory profiler工具的公共API,对目标进程的内存进行定时监控。

进一步的,记录当前系统环境并生成异常信息记录的步骤,包括:

在每一个用例API执行前后,调用objgraph工具提供的公共API,记录当前系统环境并生成异常信息记录。

进一步的,内存占用量的异常门限为1G。

进一步的,内存増量率的异常门限为50%。

第二方面,本发明还提供一种基于Python的异常捕获装置,包括:

全局异常捕获函数模块,用于对系统异常进行实时捕获;

关联模块,用于在Python库thread源码中修改对默认全局异常和用户自定义全局异常的判定;

异常信息记录模块,用于当发生异常时,调用全局异常捕获函数对异常信息进行捕获,记录当前系统环境并生成异常信息记录。

进一步的,还包括:

内存监控模块,用于对目标进程的内存进行实时监控。

异常信息记录模块,还用于当内存占用量或内存増量率超出异常门限时,记录当前系统环境并生成异常信息记录。

第三方面,本发明还提供一种计算机可读存储介质,所述计算机可读存储介质存储有机器可运行指令,所述计算机可运行指令在被处理器调用和运行时,所述计算机可运行指令促使所述处理器运行所述基于Python的异常捕获的方法。

本发明提供的基于Python的异常捕获方法和装置,通过构造全局异常钩子函数和增加try/catch代码块来捕获普通异常和进程崩溃,通过构建内存监控子线程对内存溢出类异常提前预警并记录信息,便于查看一段时间内环境变化,追踪问题根源,在记录信息时通过运用修饰符函数构建可执行的脚本供研发人员快速复现问题。以此解决现有捕获异常方案中容易遗漏代码,适用范围有限,进程崩溃时无法捕获,无法应对常见的内存溢出的问题场景,且记录的信息非常有限,开发人员根据有限信息复现问题难度大,定位效率低等诸多问题,同时通过运用全局异常钩子函数和try/catch代码块捕获异常和进程崩溃,运用memory profiler工具构造监控子线程,通过监控内存占用量和内存増量率实现异常预警,并且运用@修饰符和测试API生成可执行的脚本,以此模拟复现用户操作,对于由预警触发的记录,结合objgraph工具生成可执行脚本。

本发明能够监控系统进程内存增长,在进程内存占用量或内存增长率超过门限阀值时,触发记录模块及时保存环境信息,在程序最终发生异常时,可提供异常发生时刻和发生之前一段时间内的环境信息,便于开发人员追踪环境变化,找到问题根源。同时,在记录方式上,除了记录环境信息外,还将用户的操作转换成可执行的脚本,供开发人员快速复现问题,提升定位效率。

相应地,本发明实施例提供的一种计算机可读存储介质,也同样具有上述技术效果。

附图说明

为了更清楚地说明本发明具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例提供的总流程示意图;

图2为本发明实施例提供的异常预警捕获和记录示意图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合附图对本发明的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

本发明实施例中所提到的术语“包括”和“具有”以及它们的任何变形,意图在于覆盖不排他的包含。例如包含了一系列步骤或单元的过程、方法、系统、产品或设备没有限定于已列出的步骤或单元,而是可选地还包括其他没有列出的步骤或单元,或可选地还包括对于这些过程、方法、产品或设备固有的其它步骤或单元。

请参阅附图1-2,本发明实施例提供的一种基于Python的异常捕获方法,包括:

构建全局异常捕获函数,对系统异常进行实时捕获;

在Python库thread源码中修改对默认全局异常和用户自定义全局异常的判定;

当系统发生异常时,调用全局异常捕获函数对异常信息进行捕获,记录当前系统环境并生成异常信息记录。

通过构造全局异常钩子函数和增加try/catch代码块来捕获普通异常和进程崩溃,通过构建内存监控子线程对内存溢出类异常提前预警并记录信息,便于查看一段时间内环境变化,追踪问题根源,在记录信息时通过运用修饰符函数构建可执行的脚本供研发人员快速复现问题。以此解决现有捕获异常方案中容易遗漏代码,适用范围有限,进程崩溃时无法捕获,无法应对常见的内存溢出的问题场景,且记录的信息非常有限,开发人员根据有限信息复现问题难度大,定位效率低等诸多问题,同时通过运用全局异常钩子函数和try/catch代码块捕获异常和进程崩溃,运用memory profiler工具构造监控子线程,通过监控内存占用量和内存増量率实现异常预警,并且运用@修饰符和测试API生成可执行的脚本,以此模拟复现用户操作,对于由预警触发的记录,结合objgraph工具生成可执行脚本。

本发明实施例中,构建全局异常捕获函数的步骤,包括:

构建全局异常钩子函数和构建try/catch代码块;

定义全局异常捕获函数;

将全局异常捕获函数与全局异常钩子函数进行关联。

本发明实施例中,还包括:

构建内存监控线程,对目标进程的内存进行实时监控;

当内存占用量或内存増量率超出异常门限时,记录当前系统环境并生成异常信息记录。

本发明实施例中,构建内存监控线程,对目标进程的内存进行实时监控的步骤,包括:

构建内存监控线程;

利用memory profiler工具的公共API,对目标进程的内存进行定时监控。

本发明实施例中,记录当前系统环境并生成异常信息记录的步骤,包括:

在每一个用例API执行前后,调用objgraph工具提供的公共API,记录当前系统环境并生成异常信息记录。

本发明实施例中,内存占用量的异常门限为1G。

本发明实施例中,内存増量率的异常门限为50%。

本发明实施例还提供的一种基于Python的异常捕获装置,包括:

全局异常捕获函数模块,用于对系统异常进行实时捕获;

关联模块,用于在Python库thread源码中修改对默认全局异常和用户自定义全局异常的判定;

异常信息记录模块,用于当发生异常时,调用全局异常捕获函数对异常信息进行捕获,记录当前系统环境并生成异常信息记录。

本发明实施例中,还包括:

内存监控模块,用于对目标进程的内存进行实时监控。

异常信息记录模块,还用于当内存占用量或内存増量率超出异常门限时,记录当前系统环境并生成异常信息记录。

本发明实施例还提供的一种计算机可读存储介质,计算机可读存储介质存储有机器可运行指令,计算机可运行指令在被处理器调用和运行时,计算机可运行指令促使处理器运行基于Python的异常捕获的方法。

本发明采用构建全局异常钩子函数和增加try/catch代码块相结合的方式来捕获非内存溢出导致的软件异常,除由在代码中增加try/catch代码块来捕获异常信息外,其他未捕获的异常和进程崩溃都可以通过全局钩子函数来捕获和处理。对于内存溢出问题,通过增加监控子线程,在子线程中使用memory profiler工具提供的功能,监控目标进程的内存占用,当目标进程内存增长率或占用量超过设定门限阀值时触发记录环境信息,起到软件异常预警功能。在异常发生时即便因内存溢出无法记录异常发生时刻的环境信息,也能提供异常发生之前一段时间内的有价值记录信息。对于异常记录的信息,除了记录异常类型、异常发生模块运行时信息等常用信息外,通过采用Python修饰符功能对特定槽函数记录运行时数据,转换为测试用例API,并进一步生成与操作步骤对应的可执行脚本。对于memory profiler内存监控触发的信息记录,在生成可执行脚本中额外增加对objgraph工具引用,利用该工具提供的函数,在运行可执行脚本时可以方便的分析内存泄漏原因比如对象的循环引用等。通过本方案,开发人员通过获取一段时间内环境信息的变化,快速查找环境变化时的操作时间点或者是函数入口,通过运行脚本方便的复现问题,实现对问题的快速的定位和解决。

本发明提出了一种基于Python的异常预警、捕获和记录方法,实现过程整体示意图如附图1和2所示,其具体实施过程如下:

首先,构建全局异常钩子函数和必要的try/catch代码块。在代码中增加try/catch代码块来捕获普通异常,在catch中对捕获的异常做必要的信息记录。定义全局异常捕获函数并与Python全局异常钩子关联起来,同时在Python库thread源码中修改对默认全局异常和用户自定义全局异常函数的判定,使得用户自定义全局异常函数得以生效。这样对于try/catch无法捕获的异常以及进程崩溃问题,都会被全局异常钩子函数捕获并交由自定义的全局异常捕获函数处理。

其次,构建内存监控模块。该监控模块以子线程的方式在软件启动后常驻内存,开发人员事先根据软件功能设定进程的内存占用量预警门限,比如1G,以及内存增量率门限,比如50%,通过引入memory profiler工具,该工具可用于分析Python代码的内存占用,调用该工具的公共API比如memory_usage对目标进程进行定时监控,子线程通过对API周期性返回的内存监控结果计算内存增长率,如果内存占用量超过设定预警门限或者内存增长率超过设定门限,即触发环境信息记录流程。

最后,构建异常信息记录模块。该模块在异常捕获后被调用或内存监控子线程满足预警条件时被调用,该模块用于记录环境信息并根据不同条件生成可执行脚本。该模块的构建需要使用Python语言中@修饰符,该修饰符在关键的槽函数上增加,通过编码构建用例所需的API,并建立修饰符函数与用例API的映射关系。在捕获异常记录信息时,在修饰符函数中获取函数参数,并根据修饰符函数即槽函数和API映射关系,转换为目标用例API,这样用户的每一步操作对应的修饰符函数都转换为一个个用例API,最终由这些用例API生成可运行的脚本。运行该脚本,等同于模拟用户的一系列操作,进而复现环境。需要说明的是,当由内存监控子线程预警触发信息记录时,该场景需要分析内存使用情况,所以在记录信息时,引入objgraph工具,该工具通过分析对象间关系方便内存溢出问题的定位,在每一个用例API执行前后根据需要调用objgraph提供的公共API,比如show_growth用于查找程序运行时增加的对象,show_backrefs用于显示对象之间的引用,这样在运行脚本时,开发人员可以查看每一步操作对应的内存增长和对象引用变化,便于分析内存泄漏点。

应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释,此外,术语“第一”、“第二”、“第三”等仅用于区分描述,而不能理解为指示或暗示相对重要性。

在本发明的描述中,还需要说明的是,除非另有明确的规定和限定,术语“设置”、“安装”、“相连”、“连接”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通。对于本领域的普通技术人员而言,可以具体情况理解上述术语在本发明中的具体含义。

最后应说明的是:以上所述实施例,仅为本发明的具体实施方式,用以说明本发明的技术方案,而非对其限制,本发明的保护范围并不局限于此,尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本发明实施例技术方案的范围。都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号