Исключения применяются для простой и гибкой обработки каких-то особых ситуаций (обычно ошибок). При этом:
1. Иногда поведение программы зависит от того, какой конкретно тип исключения произошёл:
Code:
TRY .
вызов_метода
CATCH zcx_error_cancel_action.
Делаем одно
CATCH zcx_error_no_data.
Делаем другое
CATCH zcx_error_calculation.
Делаем третье
ENDTRY.
2. Часто при бросании/получении исключения нужно выполнять какие-то специфические для задачи или библиотеки действия (обработка данных, формирование сообщений, логирование и т.д.). Удобно эти действия запихнуть в класс исключения, чтобы не выполнять их в каждом try/catch-е.
3. В z-исключени можно добавлять доп-функциональность. Тогда при написании кода совершенно не нужно задумываться, что и как делать: всё уже находится внутри класса исключения.
Code:
TRY .
вызов_метода
CATCH zcx_error INTO DATA(ref_error).
DATA(bukrs) = ref_error->get_bukrs( ).
или
ref_error->display( ).
ENDTRY.
4. Z-исключения позволяют лучше контролировать программу. Например, Вы рассчитываете, что методе могут возникать только конкретные специфические для Вашей программы (или библиотеки) исключения-наследники CX_STATIC_CHECK. Если при определении метода Вы укажете конкретное исключение, то при написании/сопровождении кода компилятор Вас подстрахует: будет выдавать предупреждения, если вдруг при вызове метода может возникнуть «не то» исключение.
5. Объекты (экземпляры) классов исключений можно передавать в качестве параметров в другие методы. При этом удобно уже на этапе комиляции отсечь всё лишнее, а не получать не пойми что (cx_root) и потом пытаться разобрать, а что это вообще такое.
6. Создание z-исключений упрощает поиск: где используется именно Ваша функциональность.
7. На возможности построения иерархий классов исключений акцентироваться не буду: имхо, ООП-возможности и так очевидны.
8. Может, что-то запамятовал.
9. Преимущества при создании z-исключений не означают, что их обязательно нужно создавать на каждый чих. В простых случаях можно смело юзать стандартные классы, (возможно даже, cx_root).