Java和SAP ABAP的异常处理

简介: Java和SAP ABAP的异常处理

Recently I am prepare an internal training and have been racking my brains to find a real example for my attendees about writting a “correct” program which gets rejected by compiler. The tricky point here is as a programmer, we always treat compiler as our god: if compiler complains that our program has errors, then we are wrong. Programmers tend to believe in that compiler will NEVER make mistakes.


image.png

image.png

Checked and unchecked exception in Java

Let’s see the following Java code:package exception;

import java.sql.SQLException;

public class ExceptionForQuiz<T extends Exception> {

private void pleaseThrow(final Exception t) throws T {

 throw (T) t;

}

public static void main(final String[] args) {

 try {

  new ExceptionForQuiz<RuntimeException>().pleaseThrow(new SQLException());

 }

 catch( final SQLException ex){

  System.out.println("Jerry print");

  ex.printStackTrace();

 }

}

}What result this program will generate?

Let’s analyze it step by step.


(1) The class ExceptionForQuiz uses a generic typing syntax extends to declare a bound that T only accepts Exception and its sub classes.

As a result in my main method code the creation of new ExceptionForQuiz via the below code is legal since according to JDK source code, RuntimeException is subclass of Exception.


new ExceptionForQuiz()


Also keep in mind that RuntimeException is a kind of Unchecked exception ( do not need to be declared in method where it might be raised ), which will be compared with ABAP exception later.


image.png(2) According to Java Document, the type parameter in generic type declaration will be replaced by its bound during compile, in my exception RuntimeException will be replaced by Exception. This is called Type Erasure.

As a result, let’s forget about the try – catch for the moment.

This is original code:


image.pngThis is the code decompiled from ExceptionForQuiz.class:

image.pngYou can observe the fact of type erasure clearly.

You can also check the byte code by command javap, where the RuntimeException is erased.image.png(3) Now let’s see the result of this quiz.

The correct answer is: this program cannot pass compile! Compiler considers that SQLException could never have possibility to be raised from within TRY block.


Unfortunately, this is what I would like to do: raise SQLException via method pleaseThrow and catch it in catch block.


image.pngHow to achieve my requirement?

Just change one line as highlighted below. Instead of catching SQLException, I now catch RuntimeException in order to pacify the compiler.


Now there is no compilation error any more but when executing it, I find the raised SQLException still cannot be caught as I expect. My println is not executed at all.


image.pngI have to catch the Exception, the super class of all other exception instead ( like CX_ROOT in ABAP ), which is not a good practice in exception handling area.



image.png

Handleable and Unhandleable Exception in ABAP

You can find both definition in ABAP help.image.pngLet’s now do the similar exercise as we did previous in Java. Create a method with below signature.image.pngNow make the first test:DATA(lo_test) = NEW zcl_exception_test( ).

 DATA: lo_exception TYPE REF TO cx_atd_exception.

 CREATE OBJECT lo_exception.

 WRITE:/ 'First test' COLOR COL_NEGATIVE.

 TRY.

     lo_test->please_throw( lo_exception ).

   CATCH cx_atd_exception INTO DATA(exception1).

     WRITE:/ 'Jerry: ' , exception1->get_text( ).

 ENDTRY.It works as expected, the raised exception is caught.image.pngNow the second test:  DATA: lo_exception2 TYPE REF TO cx_sql_exception.

 CREATE OBJECT lo_exception2.

 WRITE:/ 'Second test' COLOR COL_NEGATIVE.

 TRY.

     lo_test->please_throw( lo_exception2 ).

   CATCH cx_sql_exception INTO DATA(exception).

     WRITE:/ 'In catch sql exception:' , exception->get_text( ).

 ENDTRY.The code is exactly the same as the first test, except that the exception is changed from CX_ATD_EXCEPTION to CX_SQL_EXCEPTION.

And result for the second test, 囧 …



image.pngIn order to make this CX_SQL_EXCEPTION caught-able, I have to write the same dirty code as we did in Java example:image.pngAlthough this time it works, but what is the reason of the different behaviors of these two examples?image.pngThe error message and short dump description have already given us a hint.

CX_ATD_EXCEPTION’s super class: CX_NO_CHECK. As its description says, it is not necessary to manually declare it in method signature using RAISING keyword

image.png


And CX_SQL_EXCEPTION’s super class: CX_STATIC_CHECK

image.pngAs a result now we have another solution:

Create another version of PLEASE_THROW method with RAISING keyword:image.pngimage.pngUse this new version and now CX_SQL_EXCEPTION could be caught:  WRITE:/ 'Third test' COLOR COL_NEGATIVE.

 TRY.

     lo_test->please_throw2( lo_exception2 ).

   CATCH cx_sql_exception INTO DATA(exception3).

     WRITE:/ 'In catch sql exception:' , exception3->get_text( ).

 ENDTRY.Further reading

I have written a series of blogs which compare the language feature among ABAP, JavaScript and Java. You can find a list of them below:


Lazy Loading, Singleton and Bridge design pattern in JavaScript and in ABAP

Functional programming – Simulate Curry in ABAP

Functional Programming – Try Reduce in JavaScript and in ABAP

Simulate Mockito in ABAP

A simulation of Java Spring dependency injection annotation @Inject in ABAP

Singleton bypass – ABAP and Java

Weak reference in ABAP and Java

Java byte code and ABAP Load

How to write a “correct” program rejected by compiler: Exception handling in Java and in ABAP

An small example to learn Garbage collection in Java and in ABAP

String Template in ABAP, ES6, Angular and React

Try to access static private attribute via ABAP RTTI and Java Reflection

Local class in ABAP, Java and JavaScript

Integer in ABAP, Java and JavaScript


相关文章
|
16天前
|
SQL 数据库 索引
关于 SAP ABAP REPOSRC 数据库表在 HANA 中的 DDL Definition
关于 SAP ABAP REPOSRC 数据库表在 HANA 中的 DDL Definition
17 1
关于 SAP ABAP REPOSRC 数据库表在 HANA 中的 DDL Definition
|
1月前
|
Java 程序员
Java 异常处理与正则表达式详解,实例演练及最佳实践
在 Java 代码执行期间,可能会发生各种错误,包括程序员编码错误、用户输入错误以及其他不可预料的状况。 当错误发生时,Java 通常会停止并生成错误消息,这个过程称为抛出异常。 try...catch 语句 try 语句允许您定义一段代码块,并在其中测试是否发生错误。 catch 语句允许您定义一段代码块,当 try 块中发生错误时执行该代码块。 try 和 catch 关键字成对使用,语法如下:
42 0
|
1月前
|
Java 程序员 索引
Java中的异常处理:理解、实践与最佳实践
【2月更文挑战第26天】在Java编程中,异常处理是一个重要的概念。它不仅帮助我们在程序出错时提供有关错误的详细信息,而且还允许我们以一种结构化的方式来处理这些错误。本文将深入探讨Java中的异常处理,包括如何创建自定义异常,如何使用try-catch-finally语句块,以及如何在实际编程中应用最佳实践。
26 3
|
12天前
|
存储
使用 ABAP 代码打印出 SAP CRM 系统里所有维护了 Sales Area 的 business partner id
使用 ABAP 代码打印出 SAP CRM 系统里所有维护了 Sales Area 的 business partner id
19 0
|
1月前
|
Java 编译器 程序员
Java中的异常处理:从基础到高级
【2月更文挑战第24天】本文将深入探讨Java中的异常处理,从基础的try-catch块到高级的异常处理策略。我们将了解如何使用Java的异常处理机制来提高代码的健壮性和可维护性,以及如何处理运行时和编译时的异常。
22 0
|
12天前
|
Java
Java中的throw和throws:异常处理详解
Java中的throw和throws:异常处理详解
20 0
|
12天前
|
存储 安全 数据库
SAP ABAP 中数据类型 xstring 的使用介绍
SAP ABAP 中数据类型 xstring 的使用介绍
17 0
|
15天前
什么是 SAP ABAP 里的 Subscreen
什么是 SAP ABAP 里的 Subscreen
13 1
什么是 SAP ABAP 里的 Subscreen
|
16天前
|
数据库 存储 BI
SAP ABAP CDS View 源代码存储的数据库表揭秘和其他相关数据库表介绍试读版
SAP ABAP CDS View 源代码存储的数据库表揭秘和其他相关数据库表介绍试读版
10 0
SAP ABAP CDS View 源代码存储的数据库表揭秘和其他相关数据库表介绍试读版
|
16天前
|
数据库
迈入 SAP CDS View 世界的前置知识 - SAP ABAP 数据库视图介绍试读版
迈入 SAP CDS View 世界的前置知识 - SAP ABAP 数据库视图介绍试读版
8 0
迈入 SAP CDS View 世界的前置知识 - SAP ABAP 数据库视图介绍试读版