部分转自:http://www.cnblogs.com/jiangzhengjun/p/4292428.html

+4.Funcion函数异常处理

说明:

异常处理机制可以有效避免 dump发生,

:异常类是系统预先定义好的全局类或者是由用户自定义的局部或全局的类。
在sap6.10版本里,exception classes已经取代了catchable runtime errors
基于类的异常exception classes 捕获

向上抛出异常

如果Form中出现了运行时错误,但Form签名又没有使用RAISING向上抛,则程序会直接挂掉,所以最好是向上抛

FORM subform RAISING cx_static_check cx_dynamic_check.
...

ENDFORM.

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

PARAMETERS number TYPE i.
DATA result TYPE p DECIMALS .
DATA oref TYPE REF TO cx_root.
DATA text TYPE string.
START-OF-SELECTION.
TRY.
IF ABS( number ) > .
RAISE EXCEPTION TYPE cx_demo_abs_too_large.
ENDIF.
TRY.
result = / number.
WRITE: / 'Result of division:', result.
result = SQRT( number ).
WRITE: / 'Result of square root:', result.
CATCH cx_sy_zerodivide 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时会在这里捕获
text = oref->get_text( ).
CONCATENATE 'CATCH cx_root : ' text INTO text.
ENDTRY. IF NOT text IS INITIAL.
WRITE / text.
ENDIF.
WRITE: / 'Final result:', result.

异常的触发:

运行出错时,系统会自动触发预定好的异常类(类似于Java中的运行时异常,6.10前是触发的预定好的错误)

l  可以使用RAISE EXCEPTION手动触发异常(类似Java的throw)

l  对于局部的类的METHODS、过程FORM后加上RAISING 选项来声明要抛出的异常,向上继续抛出(类似Java的throws),全局的函数异常在Exceptions标签里如下设置:

在代码中手动直接抛出异常即可:

IF SY-SUBRC <> 0.

RAISE NO AUTHORITY.

ENDIF.

IF FIELDTYPE NE 'BIN'.

RAISE INVALID_TYPE.

ENDIF.

  • 一、CX_ROOT

    四个方法:

    IF_MESSAGE~GET_TEXT           获取文本
    IF_MESSAGE~GET_LONGTEXT  获取长文本
    CONSTRUCTOR                           构建函数
    GET_SOURCE_POSITION           获取源代码位置

 CX_ROOT Constant Public Type SOTR_CONC

  • 二、cx_sy_arithmetic_error
    四个方法 《-》 相同

    IF_MESSAGE~GET_TEXT
    IF_MESSAGE~GET_LONGTEXT
    GET_SOURCE_POSITION
    CONSTRUCTOR

  • 1.抓取数据库操作异常,
*&使用异常类:cx_root
DATA: lo_root1 TYPE REF TO cx_root. TRY.
INSERT zmdm_matnr FROM ls_zmdm_matnr.
CATCH cx_root INTO lo_root1 . ENDTRY.
  • 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.
这个写法与java是相似的

  

*&方法二、(新式的)

DATA result TYPE p DECIMALS .
DATA oref TYPE REF TO cx_root.
DATA text TYPE string.
DATA i TYPE i. TRY .
i = / .
CATCH cx_root INTO oref.
text = oref->get_text( ).
WRITE: '---' , text.
RAISE EXCEPTION oref.”注:如果有此句,则不能放在Function中,否则报:Old and class-based exceptions must not be used the same time
ENDTRY.
  • 3.抓取上传数值类型字段异常,(防止上传过程系统dump)
 DATA: O_CX  TYPE  REF  TO  CX_ROOT.
DATA:LS_UPLOAD-MENGE TYPE STRING,
LS_OUTPUT-MENGG TYPE MENGE_D.
TRY .
MOVE LS_UPLOAD-MENGE TO LS_OUTPUT-MENGE.
CATCH CX_ROOT INTO O_CX.
LV_MSG = O_CX->IF_MESSAGE~GET_TEXT( ).
CONCATENATE LS_OUTPUT-MESG LV_MSG INTO LS_OUTPUT-MESG SEPARATED BY ';'.
ENDTRY.

IF LS_UPLOAD-MENGE  = 'AAA'.

   LV_MSG   =   无法将参数 'AAA' 解释为数字

ENDIF.

  •  4.+4.Funcion函数异常处理

    Funcion函数不会主动向外抛出运行时错误,所以要先在Function手动CATCH,再手动向外抛,如果出现运行时错误不抛出,则Function与会直接宕掉:

转自 江正军

三类异常:

l  CX_STATIC_CHECK

l  CX_DYNAMIC_CHECK

l  CX_NO_CHECK

具体的异常类继承结构请查看SAP帮助,输入“EXCEPTION”

类比:CX_NO_CHECK类似于Java中的Error,CX_DYNAMIC_CHECK类似于Java中的RuntimeException,CX_STATIC_CHECK类似于Java检测性异常

CX_STATIC_CHECK是一个抽象类,一般自己定的异常都要求继承于它。在程序中使用RAISE EXCEPTION 手动抛出这类异常时,方法或过程接口上一定要显示的通过RAISING 来向上层抛出异常(或者直接在方法或过程中进行处理也可以),否则静态编译时就会出现警告。

CX_NO_CHECK类型的异常一般表示系统资源不足引起的,不能在方法或过程接口后面抛出CX_NO_CHECK类型的异常,它会被隐含的抛出与传递。系统中已有预定义这类异常。

如果程序逻辑能够排除可能性的潜在性错,相应的异常就可能不用处理或继续抛出,此类情况下可以使用CX_DYNAMIC_CHECK类型的异常,这与Java中的运行时异常相似,一旦发生也该类异常,表示问题出现在程序的本身设计上,程序设计不严谨(如没有判断空指针问题)。ABAP大多数的系统预定义的异类都是属于该类型异常,这就意味着不需要处理或抛出ABAP语句可能出现的每一种异常,但一旦发生了该类异常,则表示程序的逻辑出现了问题,程序执行的结果将不会在正确。

异常类可以被定义成全局的类或者是局部的异常类,全局异常类名称以CX_, YCX_, ZCX_为前缀。系统里预定义好的全局异常类都是能CX_SY_为前缀来命名的。

如果是通过Class Builder创建的全局异常类时,由于构造器是默认创建好的,不能传递参数,所以异常文本ID只能通过TEXTID传递,但局部异常类没有这个限制。

如果在抛出的异常类在构造的过程中(构造函数中)发生了异常,则会使用CX_SY_NO_HANDLER异常来代替原来的异常实例。

函数异常的定义、抛出、与处理

CALLFUNCTION时一定不能省略Exceptions选项(EXCEPTIONS表示函数接口需要抛出异常,如果函数里抛出了异常,但调用时接口上没有加上该选项,则程序运行时会中断),否则异常不能捕获,运行时会出错。其实Exception先项就相当于TRY ... CATCH...

Exception Handling

关于异常更多详情,请参考SAP 帮助Exception Handling

ABAP抓取异常的方法:try,endtry的更多相关文章

  1. ABAP抓取异常 try ,endtry.

    DATA: O_CX TYPE REF TO CX_ROOT. TRY . MOVE LS_UPLOAD-MENGE TO LS_OUTPUT-MENGE. CATCH CX_ROOT INTO O_ ...

  2. fiddler无法抓取chrome解决方法

    前端开发中,不可避免的要和服务器端进行联调,少了fiddler这个利器可不行. 由于无线开发需要配置UA,我使用chrome进行访问,但是今儿一早过来,发现fiddler无法抓取chrome的请求了. ...

  3. C# 抓取网页内容的方法

    1.抓取一般内容 需要三个类:WebRequest.WebResponse.StreamReader 所需命名空间:System.Net.System.IO 核心代码: view plaincopy ...

  4. python 抓取异常

    aa={"a":2,"b":1} for i in range(10): aa["a"]=aa["a"]-i print ...

  5. Anjs分词器以及关键词抓取使用的方法

    首先介绍一下这个网址非常有用本文所有的关于Anjs起源来自这里请先查看一下 https://github.com/NLPchina/ansj_seg 在本次测试使用的是     import java ...

  6. jquery+thinkphp实现跨域抓取数据的方法

    jquery的$.post发送数据到服务器后台,在由后台的PHP代码执行远程抓取,存到数据库ajax返回数据到前台,前台用JS接受数据并显示. //远程抓取获取数据$("#update_ac ...

  7. 使用charles抓取htpps的方法

    自己整理的步骤做个记录 1.下载证书,官方地址:http://www.charlesproxy.com/ssl.zip 可直接点击链接下载:http://charlesproxy.com/getssl ...

  8. 【python3】 抓取异常信息try/except

    注意:老版本的Python,except语句写作"except Exception, e",Python 2.6后应写作"except Exception as e&qu ...

  9. adb常用命令和抓取log的方法

    一 adb常用的几个命令1. 查看设备adb devices这个命令是查看当前连接的设备, 连接到计算机的android设备或者模拟器将会列出显示 C:\Documents and Settings\ ...

随机推荐

  1. python+机器学习 算法用到的知识点总结

    1.浅述python中argsort()函数的用法 (1).先定义一个array数据 1 import numpy as np 2 x=np.array([1,4,3,-1,6,9]) (2).现在我 ...

  2. 【linux】 scrapy : Could not find a version that satisfies the requirement Twisted>=13.1.0 (from Scrapy) (from versions: )

    centos7 + python3 安装 scrapy 时候报错,错误信息如下: Could not find a version that satisfies the requirement Twi ...

  3. Qt编写输入法终极版V2018

    输入法是很多Qt+嵌入式linux开发的同学的痛,自从5.7自带了输入法后,这个痛终于缓解了不少,不过还有大量的嵌入式linux程序停留在qt4时代,为此特意选择了QWidget来写这个输入法,为了兼 ...

  4. gulp生成发布包脚本

    var formPost = require('./tools/submit.js');var gulp = require('gulp'), zip = require('gulp-zip'), h ...

  5. LeetCode 11 Container With Most Water(分支​判断问题)

    题目链接 https://leetcode.com/problems/container-with-most-water/?tab=Description   Problem: 已知n条垂直于x轴的线 ...

  6. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十五:FIFO储存模块(同步)

    实验十五:FIFO储存模块(同步) 笔者虽然在实验十四曾解释储存模块,而且也演示奇怪的家伙,但是实验十四只是一场游戏而已.至于实验十五,笔者会稍微严肃一点,手动建立有规格的储存模块,即同步FIFO.那 ...

  7. Word 2013无法启用Restrict Editing解决方法

    当前文档可能是Mail Merge Letter type document,MAILINGS -> Start Mail Merge -> Normal Word Document保存即 ...

  8. STM8L外部中断 为何 死循环 寄存器操作

    STM8L 系列单片机是 ST公司推出的低功耗单片机,与STM8S系列相比功耗降低了很多,但内部结构也删减了很多,使用时一定要仔细阅读手册.  这是第一次使用STM8,实现功能不是很复杂就没想研究库函 ...

  9. Unity性能优化之Draw Call(转)

    Unity(或者说基本所有图形引擎)生成一帧画面的处理过程大致可以这样简化描述:引擎首先经过简单的可见性测试,确定摄像机可以看到的物体,然后把这些物体的顶点(包括本地位置.法线.UV等),索引(顶点如 ...

  10. ubuntu1304无法启动桌面系统的问题和解决

    今天上班,从oracle官网下载个最新的virtual box,安装后重启电脑,进入桌面后竟然没有菜单栏和启动栏了(就是最上边的bar和左边的应用栏),而且所有启动的窗口都没有菜单栏,终端什么的也都没 ...