EXCEPTIONS——异常处理总结

一、ABAP异常分类
ABAP异常分为两类:1、基于异常类的异常,2、非类异常(2.1、系统定义的异常(如算术异常“cx_sy_arithmetic_error” 0被除等),2.2、用户自定义的异常(自建函数中由exception语句定义,raise语句产生的异常))。

PS:异常有的是可以截获做相应处理,有的异常为不可截获的错误异常,系统将直接产生错误,并停止执行程序。

二、基于类的异常捕获

2.1、基于类的异常是以异常类实例方式来实现,异常类是系统预先定义好的全局类(PACKAGE:S_ABAP_EXCEPTIONS)或者是由用户自定义的局部或全局的类。
在这里插入图片描述
2.2 基本语法

DATA myref TYPE REF TO cx_sy_arithmetic_error.
DATA err_text TYPE string.
DATA result TYPE i.
TRY.
    result = 1 / 0.
CATCH cx_sy_arithmetic_error INTO myref.
    err_text = myref->get_text( ).
ENDTRY.

2.3、程序实例

*&---------------------------------------------------------------------*
*& Report  ZEXCEPTION_DEMO1
*&
*&---------------------------------------------------------------------*
*& 6.1版本以后,TRY…ENDTRY结构:
*&TRY.
*&    [try_block]
*&CATCH cx_class1 cx_class2 ... [INTO oref].
*&    [catch_block]
*&    ...
*&[CLEANUP [INTO oref].
*&    [cleanup_block]]
*&ENDTRY.
*&CLEARUP是在所在的TRY CATCH发生了异常,但在本TRY CATCH中无法捕获,异常再次向上递交给上层TRY CATCH前被执行的,它不同于Java中的finally
*&---------------------------------------------------------------------*

report zexception_demo1.

parameters number type i.
data result type p decimals 2.
data oref type ref to cx_root.
data text type string.

start-of-selection.
  try.
      if abs( number ) > 100.
        raise exception type cx_demo_abs_too_large. "RAISE EXCEPTION手动触发异常
      endif.
      try.
          result = 1 / number.
          write: / 'Result of division:', result.
          result = sqrt( number ).
          write: / 'Result of square root:', result.
*        catch cx_sy_zerodivide into oref."输出0时会在这里捕获
        catch cx_sy_arithmetic_error into oref."输出0时会在这里捕获
          text = oref->get_text( ).
          concatenate 'CATCH cx_sy_zerodivide : ' text into text.
        cleanup."当内层TRY发生了异常,且没有被捕获到,抛到外层TRY前会被执行
          clear result.
          write: / 'cleanup'.
      endtry.
    catch cx_sy_arithmetic_error into oref."输入负数会在这里捕获
      text = oref->get_text( ).
      concatenate 'CATCH cx_sy_arithmetic_error : ' text into text.
*    catch cx_root into oref."输入的数大于100时会在这里捕获
    catch cx_demo_abs_too_large into oref."输入的数大于100时会在这里捕获
      text = oref->get_text( ).
      concatenate 'CATCH cx_root : ' text into text.
  endtry.

  if not text is initial.
    write / text.
  endif.
  write: / 'Final result:' NO-GAP, result NO-GAP.

三、函数异常的定义、抛出与处理
2.1 示例函数 ‘READ_TEXT’
(1)定义
在这里插入图片描述
(2)抛出
在这里插入图片描述
(3)处理
在这里插入图片描述
2.2 示例代码
&---------------------------------------------------------------------
*& Report ZEXCEPTION_DEMO2
*& 函数异常的定义、抛出、与处理
&---------------------------------------------------------------------
*&
*&
&---------------------------------------------------------------------

report zexception_demo2.
data:ltxt_lines type table of tline.
call function 'READ_TEXT'
  exporting
    id                      = 'GRUN'
    language                = sy-langu
    name                    = 'WANGMQ'
    object                  = 'MATERRIAL'
  tables
    lines                   = ltxt_lines
  exceptions
    id                      = 1
    language                = 2
    name                    = 3
    not_found               = 4
    object                  = 5
    reference_check         = 6
    wrong_access_to_archive = 7
    others                  = 8.
case sy-subrc.
  when 1. message 'Text ID invalid' type 'S' display like 'E'.
  when 2. message 'Invalid language' type 'S' display like 'E'.
  when 3. message 'Invalid text name' type 'S' display like 'E'.
  when 4. message 'Text not found' type 'S' display like 'E'.
  when 5. message 'Invalid text object' type 'S' display like 'E'.
  when 6. message 'Reference chain interrupted' type 'S' display like 'E'.
  when 7. message 'Archive handle invalid for access' type 'S' display like 'E'.
  when 8. message 'others' type 'S' display like 'E'.
endcase.
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java异常是在程序运行过程中发生的错误或异常情况。它们可以分为两种类型:可检查异常(checked exceptions)和不可检查异常(unchecked exceptions)。 可检查异常是在编译时强制要求处理的异常,即必须使用try-catch块或throws语句来处理这些异常。常见的可检查异常包括IOException、SQLException等。 不可检查异常是指RuntimeException及其子类的异常,它们是由程序错误引起的,通常是由编程错误导致的。这些异常在编译时不需要强制要求处理,但也可以选择进行处理。常见的不可检查异常包括NullPointerException、ArrayIndexOutOfBoundsException等。 在Java中,异常处理通过try-catch-finally机制来实现。在try块中编写可能抛出异常的代码,然后使用catch块捕获并处理异常。如果没有适合的catch块来处理异常,则可以使用finally块来执行一些清理操作,无论是否发生了异常。 以下是一个简单的示例代码: ```java try { // 可能抛出异常的代码 // ... } catch (ExceptionType1 e1) { // 处理ExceptionType1类型的异常 // ... } catch (ExceptionType2 e2) { // 处理ExceptionType2类型的异常 // ... } finally { // 清理操作 // ... } ``` 除了try-catch-finally机制外,还可以使用throws关键字声明方法可能抛出的异常,将异常的处理责任交给调用者。 ```java public void doSomething() throws SomeException { // 可能抛出SomeException异常的代码 // ... } ``` 总结一下,Java异常是在程序运行过程中发生的错误或异常情况。通过try-catch-finally机制可以捕获和处理异常,而throws关键字可以声明方法可能抛出的异常。处理异常可以提高程序的健壮性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值