读取数据集文件,我们是否应该处理所有可能的异常?

2020-09-13 23:29发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


您好,可能是一个愚蠢的问题,但是我只是想知道为什么我们ABAP开发人员在执行打开数据集读取数据集关闭数据集

不同地讲,您能否告诉我您认为以下代码段中未正确编码的内容(关于异常的处理)以及原因:

 CLASS lcl_app定义。
   公共部分。
     类方法read_text_file
       输入
         数据集类型序列
       正在返回
         VALUE(行)TYPE字符串表
       提高
         cx_sy_file_open
         cx_sy_codepage_converter_init
         cx_sy_conversion_codepage
         cx_sy_file_authority
         cx_sy_file_io
         cx_sy_file_close。
 ENDCLASS。


 类别lcl_app实施。
   方法read_text_file。
     DATA:TYPE字符串。

     "打开UTF-8文本文件以进行读取
     OPEN DATASET数据集,用于在默认情况下以文本模式输入。
     如果sy-subrc <> 0。
       引发例外类型cx_sy_file_open导出文件名=数据集
                             errortext ='找不到文件'## NO_TEXT。
     万一。

     做。
       "阅读下一行文字
       读取DATASET数据集INTO行。
       如果sy-subrc <> 0。
         出口。  "文件结尾->退出循环
       万一。
       将行追加到行。
     ENDDO。

     CLOSE DATASET数据集。

   终结法。
 ENDCLASS。

 选择开始。
   尝试。
       DATA(行)= lcl_app => read_text_file('/tmp/myfile')。
     捕获cx_root INTO DATA(lx_root)。
   ENDTRY。

非常感谢:)

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


您好,可能是一个愚蠢的问题,但是我只是想知道为什么我们ABAP开发人员在执行打开数据集读取数据集关闭数据集

不同地讲,您能否告诉我您认为以下代码段中未正确编码的内容(关于异常的处理)以及原因:

 CLASS lcl_app定义。
   公共部分。
     类方法read_text_file
       输入
         数据集类型序列
       正在返回
         VALUE(行)TYPE字符串表
       提高
         cx_sy_file_open
         cx_sy_codepage_converter_init
         cx_sy_conversion_codepage
         cx_sy_file_authority
         cx_sy_file_io
         cx_sy_file_close。
 ENDCLASS。


 类别lcl_app实施。
   方法read_text_file。
     DATA:TYPE字符串。

     "打开UTF-8文本文件以进行读取
     OPEN DATASET数据集,用于在默认情况下以文本模式输入。
     如果sy-subrc <> 0。
       引发例外类型cx_sy_file_open导出文件名=数据集
                             errortext ='找不到文件'## NO_TEXT。
     万一。

     做。
       "阅读下一行文字
       读取DATASET数据集INTO行。
       如果sy-subrc <> 0。
         出口。  "文件结尾->退出循环
       万一。
       将行追加到行。
     ENDDO。

     CLOSE DATASET数据集。

   终结法。
 ENDCLASS。

 选择开始。
   尝试。
       DATA(行)= lcl_app => read_text_file('/tmp/myfile')。
     捕获cx_root INTO DATA(lx_root)。
   ENDTRY。

非常感谢:)

付费偷看设置
发送
10条回答
路亽曱_Ryan
1楼 · 2020-09-13 23:38.采纳回答

否。

例外的优点是将"正常"代码与"错误处理"分开。 您避免了必须在逻辑中各处检查返回码的问题。

仅当对象对错误负责时才处理异常(例如,它具有足够的上下文信息来决定如何进行处理)。 如果不是,它将异常传递给下一个处理程序(传播异常)。 为了简化此操作,仅在RAISING子句中声明更抽象的异常类型,并在CATCH子句中使用具体的异常类型。

我会

a)检查异常层次结构,仅声明最高级别的异常CX_DYNAMIC_CHECK,也许也可以

CX_SY_FILE_ACCESS_ERROR
b)在最高级别添加异常处理,例如 打印MESSAGE lx_root TYPE'I'的错误消息。

小灯塔
2楼-- · 2020-09-13 23:58

我总是写我的代码来处理所有异常。 不处理例外应视为刑事犯罪。

我遵循下面的Jacques方法->,但是如果需要稍微不同的处理,则可能会捕获一些特定的异常。

Tong__Ming
3楼-- · 2020-09-13 23:35

捕获CX_ROOT在几乎所有情况下都是一个非常糟糕的主意。 我个人有一种情况,我花了几天的时间寻找问题的根源,结果发现CATCH CX_ROOT子句吞没了数据库死锁错误,只是因为开发人员懒得搜索他实际上想捕获的异常(/尽头)。

否则,我同意,应该以某种方式处理文件系统接口周围的异常。 在工作中,我们在文件系统语句周围有一个(可模拟的)包装器库,该库重新引发您在/.../CX_BC_IO_ERROR中继承的所有异常(从CX_STATIC_CHECK继承),因此,如果不处理它们,则会出现语法警告。 这也有帮助,因为您不必写下所有可能的异常,因为没有通用的超类。 另外,如您所述,您只能在文档中找到它们,没有自动完成功能或类似的东西。

Cikesha
4楼-- · 2020-09-13 23:41

我的帖子的附录,只是说我抓住了CX_ROOT来显示消息 给用户:捕获cx_root INTO DATA(lx_root)+消息lx_root TYPE'I'+ STOP/RETURN。

昵称总是被占用
5楼-- · 2020-09-13 23:47

阅读OPEN/READ/CLOSE DATASET(F1)的文档,并 看看提到了什么异常...

将这些内容纳入您的错误/异常处理中。

6楼-- · 2020-09-13 23:48

很高兴看到参与者之间的答案略有不同。 一切对我来说都有意义。

是的,FILE类会更好。 这里更多的是一个示例,讨论应该处理哪些异常以及在何处处理异常,以及如何处理ABAP异常的案例也很有趣。 我从没想过那些伪异常容忍的对象,现在对我来说似乎很奇怪,我牢记它们,也许有一天。 到现在为止,我始终可以处理异常。

野沐沐
7楼-- · 2020-09-13 23:53

明显的失败是事实,即显式抑制了异常。 如果您使用ATC/SLIN并包括"问题陈述",则应将其标记为1。 最好优先处理并阻止传输:-)

一种较小的攻击行为是在不进一步使用该对象的情况下捕获数据(某物)-有什么意义?

并且声明动态异常没有太多好处。 如果这是已知的冒险操作,并且您想强制执行错误处理,则可以将其转换为静态异常:

 CLASS lcx_file_error定义
                      从cx_static_check继承。
 ENDCLASS。

 CLASS lcl_app定义。
   公共部分。
     类别方法read_text_file导入数据集TYPE csequence
                                  返回值(行)TYPE string_table
                                  引发lcx_file_error。
 ENDCLASS。

 类别lcl_app实施。
   方法read_text_file。
     DATA:TYPE字符串。

     尝试。
         "打开UTF-8文本文件以进行读取
         OPEN DATASET数据集,用于在默认情况下以文本模式输入。
         如果sy-subrc <> 0。
           引发例外类型cx_sy_file_open
             出口
               文件名=数据集
               errortext ='找不到文件'## NO_TEXT。
         万一。

         做。
           "阅读下一行文字
           读取DATASET数据集INTO行。
           如果sy-subrc <> 0。
             出口。  "文件结尾->退出循环
           万一。
           将行追加到行。
         ENDDO。

         CLOSE DATASET数据集。

       捕捉cx_sy_file_open
             cx_sy_codepage_converter_init
             cx_sy_conversion_codepage
             cx_sy_file_authority
             cx_sy_file_io
             cx_sy_file_close。
         引发例外类型lcx_file_error。
     ENDTRY。

   终结法。
 

这只是一个简单的想法,在现实生活中,我会增强lcx_file_error以传递更多信息。

一周热门 更多>