乐趣区

关于segmentfault:在-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 个关键点:

  1. 给 subroutine READ_SNAPT 创立隐式加强。
  2. 定义一个内表 lt_god,用于存储思否猫的字符图案内容。
  3. 定义一个宏,用于将思否猫逐行的字符图案内容,拼接到内表 lt_god 中。
  4. 在加强实现里调用 add_line 宏,将残缺的思否猫图案内容,注入到内表 lt_god 中。
  5. 将内表 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 界面了。

本文参加了 1024 程序员节,欢送正在浏览的你也退出。

退出移动版