-
中的异常处理
作者:
dyq_972
提交日期:
2008-4-15 9:39:00
|
分类
: |
访问量:
895
在平时的
ABAP
开发中 ,需要捕获的异常通常为两种,一种是执行
SQL
,比
如主键重复,
INSE RT
语句字段类型不匹配等。还有就是
RFC
的通信错误,比如
不能进行远程 连接等。通常可以这么处理:
1.
数据库异常:
DATA: lcx_error TYPE REF TO cx_root.
DATA i_tab LIKE TABLE OF spfli WITH HEADER LINE.
DATA err_text TYPE c LENGTH 1000.
TRY.
INSERT spfli FROM TABLE i_tab.
CATCH cx_sy_open_sql_db INTO lcx_error.
err_text = lcx_error->get_text( ).
得到错误信息
sy-subrc = 4.
改变系统变量
ENDTRY.
IF sy-subrc <> 0.
WRITE :/ '
数据更新失败!
'.
WRITE err_text.
ROLLBACK WORK.
ELSE.
WRITE :/ '
数据更新成功!
'.
COMMIT WORK.
ENDIF.
异常:
TRY.
CALL FUNCTION 'Z_DAQ_CALL_JCO'
DESTINATION 'ZJCOSERVER_DAQ'
EXPORTING
pv_empid = l_empid
IMPORTING
pv_rlt = l_rlt
TABLES
it_spfli = i_tab
EXCEPTIONS
system_failure = 1 MESSAGE err_text
communication_failure = 2 MESSAGE err_text.
ENDTRY.
IF SY-SUBRC <> 0.
WRITE: / '
调用
***
失败!
' , err_text.
ENDIF.
-------------------------------------
详细的信息可以参加下面的内容:
/CompassButton/archive/2007/04/03/
1
、异常分类
从
sap 6.10
开始,
aba p
的异常分为两类:
1)
基于异常类的异常,
2)
非类异常。
非类异常又分为系统定义异常(如:被
0
除异常)和用户自定义异常
(
用户 自定
义函数中由
exception
语句定义,
raise
语句产生 的异常
)
。
异常有的是可以截获处理,
用户可以截获做 相应处理,
系统将可以继续执行程序。
如果用户不处理,
系统将产生错误,
并 停止执行程序。
有的异常为不可截获的错
误异常,系统将直接产生错误,并停止执行程序。
2
、异常处理语句
基于类异常相关语句:
a)TRY.
... guarded section
CATCH cx11 ... cx1n [INTO ex1].
... handlers for exceptions cx11 to cx1n
CATCH cx21 ... cx2m [INTO ex2].
... handlers for exceptions cx21 bis cx2m
... other handlers
CLEANUP.
... cleanup block
ENDTRY.
b)RAISE EXCEPTION TYPE class.
c)RAISING cx1 ... cxn
非类异常相关语句:
a)catch system-exceptions ARITHMETIC_ERRORS = 4.
....
endcatch.
c) raise (In function or method)
3
、异常截获处理方法
Handling exceptions using/with exception classes
截获处理方法
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.
Handling exceptions as catchable runtime errors (
向后兼容
6.10)
此异常处理
sap
建议使用
try ...endtry
代替
(
错误和异常类对应关系参见第5部
分
)< br>。
data RESULT type I.
catch system-exceptions ARITHMETIC_ERRORS = 4.
RESULT = 1 / 0.
endcatch.
if SY- SUBRC = 4.
...
endif.
4、代码样例
a)RAISING cx1 ... cxn
form adbc_exists_view using view_name type dd25l-viewname
changing subrc type sy-subrc
raising cx_sql_exception.
data: stmt type string,
ref type ref to data,
stmt_ref type ref to cl_sql_statement,
res_ref type ref to cl_sql_result_set,
cnt type sy-tabix.
subrc = 4.
create object stmt_ref.
get reference of view_name into ref.
stmt_ref->set_param( ref ).
stmt = 'select count(*) from user_views where view_name = ?'.
res_ref = stmt_ref->execute_query( stmt ).
* Host-Variable zur Ergebnisaufnahme zuordnen
get reference of cnt into ref.
res_ref->set_param( ref ).
res_ref->next( ).
if cnt = 1.
subrc = 0.
endif.
res_ref->close( ).
endform.
form exists_view using view_name type dd25l-viewname
changing subrc type sy-subrc.
try.
perform adbc_exists_view(sdb4fora)
using view_name
changing subrc.
catch cx_sql_exception.
subrc = 8.
endtry.
endform.
b)
基于类的异常代码样例
5
、错误与异常类对应关系
Exception group: ARITHMETIC_ERRORS
Class-based Exceptions Definition
*-- -------------------------------------------------- ----------------
--** CLASS class_exception
DEFINITION*-------------------------------------- --------------------
------------**
All
Exception
Class
must
inherit
from
Class
CX_ROOT
or
its
subclass*----------------------------------------- -------------------
----------*CLASS class_exception DEFINITION INHERITING FROM
cx_static_check. PUBLIC SECTION. METHODS write_SS.
Class-based Exceptions Implementation
*------------------------- -------------------------------------------
--* * CLASS class_exception
IMPLEMENTATION*------- -----------------------------------------------
----------------*CLASS
class_exception
IMPLEMENTATION.
METHOD
write_msg.
WRITE / 'Method of Class class_exception'. ENDMETHOD.
Class main Definition
*------------------------------------------------- -------------------
--** CLASS main
DEFINIT ION*---------------------------------------------- ------------
------------*CLASS
main
DEFINITION.
PUBLIC
SECTION.*
This
method
use
the
class exceptions class_exception* to deal with error. To do this we use
the statement RAISING METHODS action RAISING class_SS.
Class main Implementation
*------------------------- -------------------------------------------
--* * CLASS main
IMPLEMENTATION*------------------ ------------------------------------
---------- ------*CLASS main IMPLEMENTATION. METHOD action.* Here we're
raising an exception that should be Treated by* exception class
class_exception RAISE EXCEPTION TYPE class_exception. ENDMETHOD.
Defining Objects
DATA
o_exception
TYPE
REF
TO
class_
o_main
TYPE
REF
TO
main.
Instance Creation
START-OF-SELECTION. CREATE OBJECT o_main.
Calling Methods
*
The
statement
TRY
must
be
used
to
define
a
block
that
CATCH
the
exceptions
TRY.
o_main->action(
).*
The
Statement
CATCH
define
a
block
that
catches
the exceptions of the* exception class class_exception CATCH
class_exception. WRITE / 'Exception Caught'. ENDTRY.* The statement TRY
must be used to define a block that CATCH the exceptions TRY.
o_main->action( ).* The Statement CATCH define a block that catches the
exceptions
of
the*
exception
class
class_exception
CATCH
class_exception
INTO
o_exception.
WRITE
/
'Exception
Caught'.
o_exception->write_msg(
).
ENDTRY.
(Associated superclass: CX_SY_ARITHMETIC_ERROR)
BCD_ZERODIVIDE CX_SY_ZERODIVIDE
COMPUTE_FLOAT_ZERODIVIDE CX_SY_ZERODIVIDE
COMPUTE_INT_ZERODIVIDE CX_SY_ZERODIVIDE
ADDF_INT_OVERFLOW CX_SY_ARITHMETIC_OVERFLOW
BCD_OVERFLOW CX_SY_ARITHMETIC_OVERFLOW
COMPUTE_BCD_OVERFLOW CX_SY_ARITHMETIC_OVERFLOW
COMPUTE_COSH_OVERFLOW CX_SY_ARITHMETIC_OVERFLOW
COMPUTE_EXP_RANGE CX_SY_ARITHMETIC_OVERFLOW
COMPUTE_FLOAT_DIV_OVERFLOW CX_SY_ARITHMETIC_OVERFLOW
COMPUTE_FLOAT_MINUS_OVERFLOW CX_SY_ARITHMETIC_OVERFLOW
COMPUTE_FLOAT_PLUS_OVERFLOW CX_SY_ARITHMETIC_OVERFLOW
COMPUTE_FLOAT_TIMES_OVERFLOW CX_SY_ARITHMETIC_OVERFLOW
COMPUTE_INT_ABS_OVERFLOW CX_SY_ARITHMETIC_OVERFLOW
COMPUTE_INT_DIV_OVERFLOW CX_SY_ARITHMETIC_OVERFLOW
COMPUTE_INT_MINUS_OVERFLOW CX_SY_ARITHMETIC_OVERFLOW
COMPUTE_INT_PLUS_OVERFLOW CX_SY_ARITHMETIC_OVERFLOW
COMPUTE_INT_TIMES_OVERFLOW CX_SY_ARITHMETIC_OVERFLOW
COMPUTE_LOG10_ERROR
CX_SY_ARITHMETIC_OVERFLOW,
CX_SY_ARG_OUT_OF_DOMAIN
COMPUTE_LOG_ERROR CX_SY_ARITHMETIC_OVERFLOW, CX_SY_ARG_OUT_OF_DOMAIN
COMPUTE_MATH_OVERFLOW CX_SY_ARITHMETIC_OVERFLOW
COMPUTE_POW_RANGE CX_SY_ARITHMETIC_OVERFLOW
COMPUTE_SINH_OVERFLOW CX_SY_ARITHMETIC_OVERFLOW
COMPUTE_ACOS_DOMAIN CX_SY_ARG_OUT_OF_DOMAIN
COMPUTE_ASIN_DOMAIN CX_SY_ARG_OUT_OF_DOMAIN
COMPUTE_ATAN_DOMAIN CX_SY_ARG_OUT_OF_DOMAIN
COMPUTE_COSH_DOMAIN CX_SY_ARG_OUT_OF_DOMAIN
COMPUTE_COS_DOMAIN CX_SY_ARG_OUT_OF_DOMAIN
COMPUTE_EXP_DOMAIN CX_SY_ARG_OUT_OF_DOMAIN
COMPUTE_MATH_DOMAIN CX_SY_ARG_OUT_OF_DOMAIN
COMPUTE_POW_DOMAIN CX_SY_ARG_OUT_OF_DOMAIN
COMPUTE_SINH_DOMAIN CX_SY_ARG_OUT_OF_DOMAIN
COMPUTE_SIN_DOMAIN CX_SY_ARG_OUT_OF_DOMAIN
COMPUTE_SQRT_DOMAIN CX_SY_ARG_OUT_OF_DOMAIN
COMPUTE_TANH_DOMAIN CX_SY_ARG_OUT_OF_DOMAIN
COMPUTE_COS_LOSS CX_SY_PRECISION_LOSS
COMPUTE_MATH_LOSS CX_SY_PRECISION_LOSS
COMPUTE_SIN_LOSS CX_SY_PRECISION_LOSS
COMPUTE_TAN_LOSS CX_SY_PRECISION_LOSS
BCD_FIELD_OVERFLOW CX_SY_CONVERSION_OVERFLOW
Exception group: CONVERSION_ERRORS
(Associated superclass: CX_SY_CONVERSION_ERROR)
BCD_FIELD_OVERFLOW CX_SY_CONVERSION_OVERFLOW
CONVT_OVERFLOW CX_SY_CONVERSION_OVERFLOW
CONVT_CODEPAGE CX_SY_CONVERSION_CODEPAGE
CONVT_NO_NUMBER CX_SY_CONVERSION_NO_NUMBER
BCD_OVERFLOW CX_SY_ARITHMETIC_OVERFLOW
Exception group: CREATE_DATA_ERRORS
(Associated superclass: CX_SY_CREATE_ERROR)
This
group
contains
runtime
errors
that
may
occur
during
the
creation
of
data objects.
CREATE_DATA_UNKNOWN_TYPE CX_SY_CREATE_DATA_ERROR
CREATE_DATA_NOT_ALLOWED_TYPE CX_SY_CREATE_DATA_ERROR
CREATE_DATA_LEN_NOT_ALLOWED CX_SY_CREATE_DATA_ERROR
CREATE_DATA_ILLEGAL_LENGTH CX_SY_CREATE_DATA_ERROR
CREATE_DATA_ILLEGAL_DECIMALS CX_SY_CREATE_DATA_ERROR
CREATE_DATA_ILLEGAL_INIT_SIZE CX_SY_CREATE_DATA_ERROR
Exception group: CREATE_OBJECT_ERRORS
(Associated superclass: CX_SY_CREATE_ERROR)
This
group
contains
runtime
errors
that
may
occur
during
the
creation
of
objects.
CREATE_OBJECT_CLASS_NOT_FOUND CX_SY_CREATE_OBJECT_ERROR
CREATE_OBJECT_CLASS_ABSTRACT CX_SY_CREATE_OBJECT_ERROR
CREATE_OBJECT_CREATE_PRIVATE CX_SY_CREATE_OBJECT_ERROR
CREATE_OBJECT_CREATE_PROTECTED CX_SY_CREATE_OBJECT_ERROR
Exception group: DATA_ACCESS_ERRORS
(Associated superclass: CX_SY_DATA_ACCESS_ERROR)
This
group
contains
runtime
errors
that
may
occur
during
subfield
access
(with offset/length) to data objects.
DATA_OFFSET_NEGATIVE CX_SY_RANGE_OUT_OF_BOUNDS
DATA_LENGTH_NEGATIVE CX_SY_RANGE_OUT_OF_BOUNDS
DATA_LENGTH_0 CX_SY_RANGE_OUT_OF_BOUNDS
DATA_LENGTH_TOO_LARGE CX_SY_RANGE_OUT_OF_BOUNDS
DATA_OFFSET_LENGTH_TOO_LARGE CX_SY_RANGE_OUT_OF_BOUNDS
REFI_WRONG_SECTION CX_SY_RANGE_OUT_OF_BOUNDS
STRING_OFFSET_NEGATIVE CX_SY_RANGE_OUT_OF_BOUNDS
STRING_OFFSET_TOO_LARGE CX_SY_RANGE_OUT_OF_BOUNDS
STRING_LENGTH_NEGATIVE CX_SY_RANGE_OUT_OF_BOUNDS
STRING_LENGTH_TOO_LARGE CX_SY_RANGE_OUT_OF_BOUNDS
STRING_OFFSET_LENGTH_TOO_LARGE CX_SY_RANGE_OUT_OF_BOUNDS
DATA_OFFSET_LENGTH_NOT_ALLOWED CX_SY_OFFSET_NOT_ALLOWED
-
-
-
-
-
-
-
-
本文更新与1970-01-01 08:00,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/553244.html
-
上一篇:没有了
下一篇:没有了