SAP ABAP - Xử lý ngoại lệ
An exceptionlà một vấn đề phát sinh trong quá trình thực hiện một chương trình. Khi một ngoại lệ xảy ra, quy trình bình thường của chương trình bị gián đoạn và ứng dụng chương trình kết thúc bất thường, điều này không được khuyến nghị, do đó những ngoại lệ này phải được xử lý.
Ngoại lệ cung cấp một cách để chuyển quyền kiểm soát từ một phần của chương trình sang phần khác. Xử lý ngoại lệ ABAP được xây dựng dựa trên ba từ khóa - RAISE, TRY, CATCH và CLEANUP. Giả sử một khối sẽ tạo ra một ngoại lệ, một phương pháp sẽ bắt một ngoại lệ bằng cách sử dụng kết hợp các từ khóa TRY và CATCH. Một khối TRY - CATCH được đặt xung quanh mã có thể tạo ra một ngoại lệ. Sau đây là cú pháp để sử dụng TRY - CATCH -
TRY.
Try Block <Code that raises an exception>
CATCH
Catch Block <exception handler M>
. . .
. . .
. . .
CATCH
Catch Block <exception handler R>
CLEANUP.
Cleanup block <to restore consistent state>
ENDTRY.
RAISE- Các ngoại lệ được nêu ra để chỉ ra rằng một số tình huống ngoại lệ đã xảy ra. Thông thường, một trình xử lý ngoại lệ cố gắng sửa chữa lỗi hoặc tìm một giải pháp thay thế.
TRY- Khối TRY chứa mã hóa ứng dụng có các ngoại lệ sẽ được xử lý. Khối câu lệnh này được xử lý tuần tự. Nó có thể chứa thêm các cấu trúc điều khiển và các lệnh gọi của các thủ tục hoặc các chương trình ABAP khác. Theo sau nó là một hoặc nhiều khối bắt.
CATCH- Một chương trình bắt một ngoại lệ với một trình xử lý ngoại lệ tại vị trí trong một chương trình mà bạn muốn xử lý vấn đề. Từ khóa CATCH cho biết việc bắt một ngoại lệ.
CLEANUP- Các câu lệnh của khối CLEANUP được thực thi bất cứ khi nào có ngoại lệ xảy ra trong khối TRY không bị bắt bởi trình xử lý của cùng một cấu trúc TRY - ENDTRY. Trong mệnh đề CLEANUP, hệ thống có thể khôi phục một đối tượng về trạng thái nhất quán hoặc giải phóng các tài nguyên bên ngoài. Nghĩa là, công việc dọn dẹp có thể được thực thi đối với ngữ cảnh của khối TRY.
Nâng cao ngoại lệ
Các ngoại lệ có thể được nêu ra tại bất kỳ thời điểm nào trong một phương thức, một mô-đun chức năng, một chương trình con, v.v. Có hai cách để đưa ra một ngoại lệ -
Các trường hợp ngoại lệ do hệ thống thời gian chạy ABAP đưa ra.
Ví dụ Y = 1 / 0. Điều này sẽ dẫn đến lỗi thời gian chạy kiểu CX_SY_ZERODIVIDE.
Các ngoại lệ do lập trình viên nêu ra.
Nâng và tạo một đối tượng ngoại lệ đồng thời. Tăng một ngoại lệ với một đối tượng ngoại lệ đã tồn tại trong kịch bản đầu tiên. Cú pháp là: RAISE EXCEPTION exep.
Bắt ngoại lệ
Xử lý được sử dụng để bắt các trường hợp ngoại lệ
Hãy xem một đoạn mã -
DATA: result TYPE P LENGTH 8 DECIMALS 2,
exref TYPE REF TO CX_ROOT,
msgtxt TYPE STRING.
PARAMETERS: Num1 TYPE I, Num2 TYPE I.
TRY.
result = Num1 / Num2.
CATCH CX_SY_ZERODIVIDE INTO exref.
msgtxt = exref→GET_TEXT( ).
CATCH CX_SY_CONVERSION_NO_NUMBER INTO exref.
msgtxt = exref→GET_TEXT( ).
Trong đoạn mã trên, chúng tôi đang cố gắng chia Num1 cho Num2 để nhận được kết quả là một biến kiểu float.
Có thể tạo ra hai loại ngoại lệ.
Lỗi chuyển đổi đầu số.
Chia cho không ngoại lệ. Trình xử lý bắt ngoại lệ CX_SY_CONVERSION_NO_NUMBER và cả ngoại lệ CX_SY_ZERODIVIDE. Ở đây phương thức GET_TEXT () của lớp ngoại lệ được sử dụng để lấy mô tả của ngoại lệ.
Thuộc tính của ngoại lệ
Dưới đây là năm thuộc tính và phương pháp của ngoại lệ -
Không. | Thuộc tính & Mô tả |
---|---|
1 | Textid Được sử dụng để xác định các văn bản khác nhau cho các ngoại lệ và cũng ảnh hưởng đến kết quả của phương thức get_text. |
2 | Previous Thuộc tính này có thể lưu trữ ngoại lệ ban đầu cho phép bạn tạo một chuỗi ngoại lệ. |
3 | get_text Điều này trả về biểu diễn văn bản dưới dạng một chuỗi theo ngôn ngữ hệ thống của ngoại lệ. |
4 | get_longtext Điều này trả về biến thể dài của biểu diễn dạng văn bản của ngoại lệ dưới dạng một chuỗi. |
5 | get_source_position Cung cấp tên chương trình và số dòng đạt đến nơi mà ngoại lệ được nêu ra. |
Thí dụ
REPORT ZExceptionsDemo.
PARAMETERS Num_1 TYPE I.
DATA res_1 TYPE P DECIMALS 2.
DATA orf_1 TYPE REF TO CX_ROOT.
DATA txt_1 TYPE STRING.
start-of-selection.
Write: / 'Square Root and Division with:', Num_1.
write: /.
TRY.
IF ABS( Num_1 ) > 150.
RAISE EXCEPTION TYPE CX_DEMO_ABS_TOO_LARGE.
ENDIF.
TRY.
res_1 = SQRT( Num_1 ).
Write: / 'Result of square root:', res_1.
res_1 = 1 / Num_1.
Write: / 'Result of division:', res_1.
CATCH CX_SY_ZERODIVIDE INTO orf_1.
txt_1 = orf_1→GET_TEXT( ).
CLEANUP.
CLEAR res_1.
ENDTRY.
CATCH CX_SY_ARITHMETIC_ERROR INTO orf_1.
txt_1 = orf_1→GET_TEXT( ).
CATCH CX_ROOT INTO orf_1.
txt_1 = orf_1→GET_TEXT( ).
ENDTRY.
IF NOT txt_1 IS INITIAL.
Write / txt_1.
ENDIF.
Write: / 'Final Result is:', res_1.
Trong ví dụ này, nếu số lớn hơn 150, ngoại lệ CX_DEMO_ABS_TOO_LARGE sẽ được nâng lên. Đoạn mã trên tạo ra kết quả sau cho số 160.
Square Root and Division with: 160
The absolute value of number is too high
Final Result is: 0.00