...
在使用系统过程中,出现以下几类异常,通常定义为功能类报错异常,可以采用本文档方案跟踪:
1.系统功能使用过程,有明确异常提醒的
1)场景一:界面弹出异常
点击【显示栈信息】或查看错误详情,可以看到详细错误日志(如报问题就是把这个复制之后报问题):
2)场景二:启动失败,日志有ERROR日志的,也算是异常提醒
3)场景三:ETL运行失败,在具体节点右键菜单-->查看日志
2.前端个别操作界面打开空白或没反应,但又不是系统整体无响应的
二、跟踪方法
2.1系统功能使用过程,有明确异常提醒的
2.1.1理解报错详情
无论是通过界面弹窗显示的提醒,还是启动过程看到的错误日志,都有个错误详情,也就是程序里的调用栈,调用栈结构:
栈顶(最上方):最近调用的函数(最后执行的操作)。:最近调用的函数(最后执行的操作)。
栈底(最下方):最初调用的函数(程序的起点)。:最初调用的函数(程序的起点)。
错误通常出现在栈顶附近,但根源可能在栈底方向。,但根源可能在栈底方向。
栈中每个函数都会显示函数名、所在源码文件或包、源码文件行号,这些可有助于程序员定位程序异常,对于系统使用者主要关注错误描述。
...
上例调用路径:main() → processOrder() → calculateTotal(),错误发生在calculateTotal中。
相当于如果函数A调用函数B,函数B调用函数C,而错误发生在函数C中,调用栈会显示C → B → A, 如果错误发生在C,但是B也封装了一个新异常抛出,相当于B也发生异常,就会出现两个错误调用栈:B→ A Caused by: C→ B→ A,而后一个C→ B→ A藏着真正的异常原因。
...
代码块 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
Exception in thread "main" java.lang.RuntimeException: 计算订单总价失败 at com.Example.processOrder(Example.java:5) at com.Example.main(Example.java:20) Caused by: java.lang.ArithmeticException: Division by zero at com.Example.calculateTotal(Example.java:15) at com.Example.processOrder(Example.java:8) ... 2 more |
这类异常跟踪口诀就是“从下往上看,Caused by 是根源;从上往下读,业务封装是表象。”
跟踪排查步骤
2.1.2跟踪排查步骤
1.聚焦错误描述:找到最后一个 Caused by
,没Caused by
的直接是调用栈顶部的错误信息:
上例它指向最原始的错误(如 Division by zero
)。
2.提炼错误关键字搜索,忽略变量名或具体的值
如上述案例的错误关键字就可以提炼为:
错误描述
...
:Division by zero(除数为0)
错误类型
...
:java.lang.RuntimeException
还有以下一个smartbi中的真实案例:
...
提炼的内容有:
错误描述
...
:获取数据库连接失败,Unknown server host name
错误类型
...
:java.sql.SQLException
上例'10.110.111.2251',属于具体值,变量值通常在搜索中无用的,不同系统会不同。
3.利用互联网资源搜索解决方案
1)直接在搜索引擎中搜索刚刚提炼的错误关键字
“获取数据库连接失败,Unknown server host name ”,如不知如何解决无法识别主机地址的异常,可互联网或AI搜索:
2)利用AI搜索
以下是AI搜索的效果(借助AI搜索,不提炼关键字,整个错误堆栈复制进去也可):
...
2.1.3上报问题
当出现明确异常提醒的情况,在借助互联网资源、官方WIKI文档、社区、或问题跟踪系统等搜索无法找到解决方案,需按以下方式上报异常:
在使用系统什么功能(复杂的需描述操作复现步骤),出现什么异常,异常详细信息,其中异常详细信息就是错误弹窗中【显示栈信息】/错误详情,点进去可复制,里面含有版本号和详细的错误栈。,里面含有版本号和详细的错误栈。
以下面这个系统功能异常为例:
错误描述:在把数据库添加到Smartbi,测试数据连接过程,出现连接报错
...
如不方便复制详情,也可通过拍照等手段,关键需要参照前面跟踪排查手段,把关键错误信息要上报发回(通常是错误详情的开始一页,以及最后一个Caused by:部分及上下文)。
上报途径可参照系统功能导航页:
2.
...
2
...
前端个别操作界面打开空白或点击没反应,但又不是系统整体无响应的
这类异常通常是浏览器端出现脚本异常,或服务端返回不合前端预期带来的前端异常,通常此时可通过浏览器开发者工具查看是否有脚本异常,把此脚本异常上报发回。
每个浏览器的开发者工具打开可能有所不同,可互联网搜索“浏览器名 开发者工具打开方式”,如chrome,就是右上角工具-->更多工具-->开发者工具,切换到控制台看脚本异常。,切换到控制台看脚本异常。
上报问题除了这个错误截图,需描述重现操作步骤。
...
三、常见问题
1.上报问题时仅截取错误弹窗,未附上重现步骤、错误详情
错误弹窗内的错误描述经常是不全的,或其并非根因,需要看错误详情中的底部Caused by,如未附上错误详情,通常开发人员无法定位问题。
面对系统的一些未知异常,如报“系统检查错误”,虽有错误详情及代码位置,但依然需要借助重现才能解决问题,所以能重现的问题,上报时告知重现步骤可提高解决效率。
2.互联网搜索解决方案时,未提炼错误描述,把变量名具体值带入搜索
功能类的异常提醒,需大概理解错误描述内容,提炼里面的错误描述及业务关键字,因为带入太多无意义信息,可能让搜索效果大打折扣。如在百度搜索:“获取数据库连接失败[cause Throwable ClassName:java.sql.SQLException]:获取数据库连接失败[cause Throwable ClassName:java.sql.SQLException]:Unknown server host name '11.10.111.2251'.,datasourceId=I8a8aedaa019564656465cd6c01956f4ef6555ce6”,效果会远不如:“获取数据库连接失败,Unknown server host name”。
如果是借助AI搜索,因其本身会理解用户意图,这个问题可忽略。
3.忽略借助AI搜索,提升问题解决效率
很多AI,如DeepSeek、豆包,不仅可以输入文字搜索,也可粘帖图片,接收图片搜索,在不知道错误描述在说什么不知如何提炼关键词时,可借助AI搜索原因及解决方案。