在 ABAP 开发工具运行时错误显示界面里植入思否猫
我们开发人员每天编程,调试代码,不可避免地会遇到运行时异常和运行时错误。一旦运行时错误发生,程序会非正常终止,标志着程序的实际执行情况同我们的预期有差异,想必每一位开发人员看到运行时错误心情都不会太好。
笔者平时使用的后台开发语言是 ABAP,使用的开发 IDE 是 SAPGUI,因此尝试着把思否社区的吉祥物,一只可爱的思否猫,植入到 ABAP 运行时错误显示界面上来,试图让思否猫给遇到运行时错误的倒霉的开发人员一丝慰藉。
ABAP 开发工具里显示运行时错误的事物码为 ST22,其标准实现 ABAP 程序名称为 SAPMS380.
按照笔者文章介绍的步骤开发完成后,效果如下:
这是在我的 ABAP 系统里的实现效果:
下面是详细的实现步骤。
我们使用 ABAP 增强工具,对这个系统级别的 ABAP 报表进行增强,在增强里创建我们自己的植入思否猫的逻辑。
我们在这个报表的 READ_SNAPT 的 subroutine 里做增强,这个 subroutine 在运行时异常的具体内容,从数据库表读取到 ST22 界面时调用,因此这是一个最佳的植入思否猫图案的 hook 所在:
名叫 read_snapt
的 subroutine,其输出参数 text_out, 存放的就是显示在 ST22 事物码运行时的明细信息,因此我们创建一个隐式增强,把思否猫对应的字符格式的图案,添加到输出参数 text_out 即可。
隐式增强的源代码如下图所示:
ENHANCEMENT 1 ZST22_ENHANCEMENT. "active version
data: lt_god like text_out[] with header line.
define add_line.
append &1 to lt_god.
end-of-definition.
add_line: ''.
if ttype = 'W'. "// What happened?
insert lines of lt_god into text_out index 1.
endif.
ENDENHANCEMENT.
代码实现有 5 个关键点:
-
给 subroutine
READ_SNAPT
创建隐式增强。 -
定义一个内表 lt_god,用于存储思否猫的字符图案内容。
-
定义一个宏,用于将思否猫逐行的字符图案内容,拼接到内表 lt_god 中。
-
在增强实现里调用
add_line
宏,将完整的思否猫图案内容,注入到内表 lt_god 中。 -
将内表 lt_god 包含的思否猫图案完整内容,添加到 subroutine read_snapt 的输出参数
text_out
中,这样思否猫的字符图案,将会出现在 ST22 显示界面的头部。
至此 ABAP 系统的增强工作就实现完毕了,剩下的则是将官网下载的思否猫图片,转换成纯粹的字符显示形式,这样我们就可以将这些字符,直接粘贴到前文介绍的 READ_SNAPT
subroutine 实现的隐式增强内部。
42 行 Python 代码即可搞定:
import base64
import re
from io import BytesIO
from PIL import Image
import base64
file_path = 'C:/temp/cat.png'
img = Image.open(file_path)
char = list('M3NB6Q#OC?7>!:–;. ')
# 颜色值映射字符串
def get_char(r, g, b, alpha=256):
if alpha == 0:
return ' '
grey = (2126 * r + 7152 * g + 722 * b) / 10000
char_idx = int((grey / (alpha + 1.0)) * len(char))
return char[char_idx]
img = Image.open(file_path)
img_widht = img.size[0]
img_height = img.size[1]
# 设定缩放比例
scale_width = 0.2 # 0.75
scale_height = 0.2 # 0.5
# 缩放图片
img = img.resize((int(img_widht*scale_width),
int(img_height*scale_height)), Image.NEAREST)
text = ''
for i in range(int(img_height*scale_height)):
for j in range(int(img_widht*scale_width)):
text += get_char(*img.getpixel((j, i)))
text += '\n'
print(text)
我们使用 Python 提供的 PIL 库,读取包含思否猫的图片文件,取得其宽度和高度之后,逐一便利图片每一行的每一个像素,将其 RGB 值利用公式转换成灰度值,再把这些灰度值转换成字符数组 char 的索引。这样,思否猫图片的每一个像素,就唯一对应字符数组里的一个字符。我们把这些字符拼接到输出变量 text 里。
将上述 Python 代码另存为成 cat.py 文件,利用命令行 python cat.py > result.txt
, 然后将 result.txt
的内容复制到 ABAP 报表 SAPMS380 的隐式增强实现里即可。
最后我们做一个测试,新建一个 ABAP 报表,随便写一句会引起运行时异常的代码,比如 ASSERT 1 = 0
,然后执行:
我们会立即跳转到 ST22 事物码的运行时错误输出界面,Runtime Errors 字段值为 ASSERTION_FAILED
, 这正是 ASSERT 1 = 0
引起的运行时错误。
从图中可以看到,思否猫的图案已经成功嵌入到 ST22 界面了。
相关文章
- 关于Python3的import问题(pycharm可以运行,命令行import错误)
- java 字符串数组 下标_运行时错误9:使用字符串数组时,下标超出范围「建议收藏」
- 【day10】LeetCode(力扣)刷题(注释详细)[707.设计链表][278.第一个错误的版本][98. 验证二叉搜索树]
- 【错误记录】无法打开 “xxx“ , 因为 Apple 无法检查其是否包含恶意软件
- 【错误记录】Mac 中 IntelliJ IDEA 运行 Python 程序报错 ( No module named ‘threadpool‘ )
- 腾讯轻联流程运行错误如何排查问题?
- SQLServer 错误 2020 为实体“%.*ls”报告的依赖关系不包含对列的引用。 这是由于此实体引用的对象不存在,或由于此实体中的一个或多个语句有错误。 在重新运行该查询之前,请确保该实体中没有错误并且该实体引用的所有对象都存在。 故障 处理 修复 支持远程
- SQLServer 错误 2518 对象 ID O_ID (对象”O_NAME”):由于禁用了公共语言运行时(CLR),无法检查此对象的计算列和用户定义类型。 故障 处理 修复 支持远程
- 错误
- pandas read_csv 错误: pandas.parser.CParserError: Error tokenizing data. C error详解大数据
- [一]FileDescriptor文件描述符 标准输入输出错误 文件描述符详解编程语言
- Oracle事务处理异常:解决01446错误(oracle01446)
- 修复linux下Vim运行出错的方法(linuxvim错误)
- 解决MySQL错误193:最佳实践(mysql错误193)
- Oracle出现错误:如何快速解决?(oracle 错误)
- MSSQL运行错误:解决错误126(mssql 错误 126)
- MySQL数据库出现1046错误的解决方法(mysql中1046)
- cmd无法正常执行MySQL脚本(cmd执行mysql错误)
- 错误解决Oracle 06512错误异常抛出未被捕获(oracle中06512)
- IIS7.0运行ASP500错误解决方法
- sqlserver普通用户运行错误解决方法补充
- 捕捉并保存ASP运行错误的函数代码
- js的.innerHTML=""IE9下显示有错误的解决方法
- Win7IIS7.5运行ASP时出现500错误的解决办法