Текущее время: Ср, июн 25 2025, 21:37

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: Exception Handling
СообщениеДобавлено: Пн, сен 19 2005, 19:43 
Модератор
Модератор

Зарегистрирован:
Пт, ноя 12 2004, 11:40
Сообщения: 542
Откуда: Москва
Пол: Мужской
Проблема с обобработкой исключений ....

есть интерфейс
Code:
INTERFACE I1.
  METHODS get_data.
ENDINTERFACE.


есть класс реализующий этот интерфейс
Code:

CLASS cl_class_test DEFINITION.
  PUBLIC SECTION.
    INTERFACES i1.
ENDCLASS.

CLASS cl_carclass IMPLEMENTATION.

  METHOD i1~get_data.
    CALL FUNCTION 'get_local_data'.
       EXPORTING
         a = a
       EXCEPTION
         e1      = 1
         e2      = 2
         e3      = 3
         others = 4.

    IF sy-subrc <> 0.
*    Вот здесь я хочу пробросить исключение чтобы потом его
*    обработать
    ENDIF.

  ENDMETHOD.                 

ENDCLASS.



....................
....................


* А обработать хочеться как-то вот так ...
Code:
    DATA: ex TYPE REF TO cx_root.

    TRY.
        CALL METHOD class_ref->i1~get_data.
      CATCH cx_root INTO ex. " плохой вариант...
        MESSAGE 'Data getting Error...' TYPE 'E'.
    ENDTRY.



Вопрос - что нужно подписать в блок
INTERFACE

ENDINTERFACE
?

Как выбросить исключения и как корректно их обработать?


P.S.
Пока дошел только до того что наверно надо будет делать свой класс исключений потомок от кого-нибудь.....


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, сен 20 2005, 00:20 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Ср, июн 22 2005, 09:51
Сообщения: 208
Пол: Мужской
Так вроде-бы, при описании метода в интерфейсе, можно указать контсрукцию exceptions.

На мой мутный взгляд - достаточно. :D

_________________
С уважением, В.Ш.
4.6C


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, сен 20 2005, 08:49 
Модератор
Модератор

Зарегистрирован:
Пт, ноя 12 2004, 11:40
Сообщения: 542
Откуда: Москва
Пол: Мужской
Цитата:
Так вроде-бы, при описании метода в интерфейсе, можно указать контсрукцию exceptions.


ага можно только вот что в ней писать?
хотелось бы иметь возможность обрабатывать каждое исключение по отдельности ...[/code]

вот еще что на ум пришло :)
может быть есть классы стандартых исключений которые мне подойдут и тогда можно будет не содавать свой класс а выбрасывать их и ловить так же ... как я писал выше...
try

catch...
?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, сен 20 2005, 09:13 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Ср, июн 22 2005, 09:51
Сообщения: 208
Пол: Мужской
Ich Will написал:
ага можно только вот что в ней писать?
хотелось бы иметь возможность обрабатывать каждое исключение по отдельности ...


Описываешь в интерфейсе метод:

Code:
Methods MyAcction  Exceptions  expt1 expt2 expt3.


Потом в классе реализуешь некий интерфейс с указанным методом:

Code:
method iface~MyAcction.
  if ..
     raise expt1.
  endif.
endmethod.


Потом вызываешь:

Code:
  call method ip->MyAcction
     Exceptions  expt1 = 1 expt2 = 2 expt3 = 3 others = 4.
*** И проверяешь.
    case sy-subrc.
      when 1.
*** expt1
       when 2.
*...
    endcase.


А try .. catch я в ABAPe не нашел.
Есть только CATCH SYSTEM-EXCEPTIONS ... ENDCATCH. :roll:
:D

_________________
С уважением, В.Ш.
4.6C


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, сен 20 2005, 09:46 
Модератор
Модератор

Зарегистрирован:
Пт, ноя 12 2004, 11:40
Сообщения: 542
Откуда: Москва
Пол: Мужской
Спасибо большое Виктор за помощь... пока что в дамп выкидывает ...
тоесть не ловиться :) будем бороться

про try catch
в хелпе по F1 вкладка Special Topics -> Exception Handling -> Class-Based Exeption

там есть пример не плохой но пока что не получается ничего :(


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, сен 20 2005, 09:57 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Ср, июн 22 2005, 09:51
Сообщения: 208
Пол: Мужской
Цитата:
Спасибо большое Виктор за помощь... пока что в дамп выкидывает ... тоесть не ловиться будем бороться


Что в дамп выкидывает? Подробнее давай. :D

_________________
С уважением, В.Ш.
4.6C


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, сен 20 2005, 10:10 
Модератор
Модератор

Зарегистрирован:
Пт, ноя 12 2004, 11:40
Сообщения: 542
Откуда: Москва
Пол: Мужской
получилось использовать один из стандартных классов исключений
(их оказывается очень много ;) )

вот как получилось
Code:
INTERFACE i.
  METHODS: lock_table.
ENDINTERFACE.


Code:

CLASS cl_test DEFINITION.
    PUBLIC SECTION.
          INTERFACES i.
ENDCLASS.

CLASS cl_test IMPLEMENTATION.
METHOD i~lock_table.

    CALL FUNCTION 'ENQUEUE_EZTEST'
      EXPORTING
       mode_ztest        = 'E'
       mode_ztest        = 'E'
       mandt                = sy-mandt
     EXCEPTIONS
       foreign_lock       = 1
       system_failure    = 2
       OTHERS             = 3.

    CASE sy-subrc.
      WHEN 1.
        RAISE EXCEPTION TYPE cx_os_db_select. " тут просто для пробы взял этот класс :)
    ENDCASE.
ENDCLASS.



....................
....................

Code:
    DATA: ex TYPE REF TO cx_root.
    TRY.
        CALL METHOD cl_test_ref->i~lock_table.
      CATCH cx_root INTO ex.
        MESSAGE 'Поймали !!! ' TYPE 'S' DISPLAY LIKE 'E'.
    ENDTRY.



теперь осталось либо создать свой класс исключений унаследованый от кого-нибудь или найти все-таки стандартный класс...
вот ....

а в идеале должно быть что-то вроде
Code:
    DATA: ex TYPE REF TO cx_root.
    TRY.
        CALL METHOD cl_test_ref->i~lock_table.
     
      CATCH my_exception1 INTO ex.
        MESSAGE 'Поймали первое !!! ' TYPE 'S' DISPLAY LIKE 'E'.

      CATCH my_exception2 INTO ex.
        MESSAGE 'Поймали второе !!! ' TYPE 'S' DISPLAY LIKE 'E'.

      CATCH cx_root INTO ex.
        MESSAGE 'Поймали все остальные !!! ' TYPE 'S' DISPLAY LIKE 'E'.
    ENDTRY.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, сен 20 2005, 10:30 
Модератор
Модератор

Зарегистрирован:
Пт, ноя 12 2004, 11:40
Сообщения: 542
Откуда: Москва
Пол: Мужской
Я уже начианю подумывать что цель не оправдывает средства .... :(

так как для каждого своего исключения нужно содавать класс....(или целую иерархию классов )

Интересно.... может быть можно как то попроще сделать?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, сен 20 2005, 11:28 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Ср, июн 22 2005, 09:51
Сообщения: 208
Пол: Мужской
Посмотри вот это: https://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/com.sap.km.cm.docs/library/webas/abap/abap-exception-handling/A%20Programmers%20Guide%20to%20the%20New%20Exception%20Handling%20Concept%20in%20ABAP

Можно, видимо, создать свой класс исключений с атрибутами. При "возбуждении" исключения, в атрибуты записывать свои значения.
На этапе отлова исключения - считывать значения атрибутов и реагировать на них в соответствии со своими взглядами на жизнь. :)

:D

_________________
С уважением, В.Ш.
4.6C


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, сен 20 2005, 11:28 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Вт, авг 17 2004, 08:55
Сообщения: 331
Откуда: Украина, г.Мариуполь
Пол: Мужской
Я уже поднимал этот вопрос в этом топике. На самом деле, можно вообще отлавливать только CX_ROOT, т.к. он является базовым классом для всех исключений. Свои же исключения необязательно регистрировать, если есть какие-то стандартные, подходящие под конкретные нужды


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, сен 20 2005, 12:41 
Модератор
Модератор

Зарегистрирован:
Пт, ноя 12 2004, 11:40
Сообщения: 542
Откуда: Москва
Пол: Мужской
Виктор - спасибо за ссылку почитаю.... :)

Цитата:
На самом деле, можно вообще отлавливать только CX_ROOT...


в том то и дело, что так-то конечно оно можно, но не правильно так как тогда не понятно какая исключительная ситуация случилась...
и соответственно не понятно как реагировать ...

напримере моего примера :) если случилось foreign_lock то это одно
а если system_failure то это уже совсем другое ...
вот и в связи с этим не много лениво ;) становиться для каждого эксепшина создавать класс...

вот думаю как можно красиво выкрутиться ... :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, сен 20 2005, 16:20 
Модератор
Модератор

Зарегистрирован:
Пт, ноя 12 2004, 11:40
Сообщения: 542
Откуда: Москва
Пол: Мужской
Все-таки надо мне хелп внимательнее читать... ;)

в интерфейс добавляем

Code:
INTERFACE.
    lock_table RAISING cx_hrso_lock_fail.
ENDINTERFACE.


в реализации метода его выбрасываем
Code:
CASE sy-subrc.
    WHEN 1.
       RAISE EXCEPTION TYPE cx_hrso_lock_fail.
..........
ENCASE.


в коде перехватываем
Code:
    DATA: ex  TYPE REF TO cx_hrso_lock_fail,
              str TYPE string.

   TRY.
        CALL METHOD class_ref->i~lock_table.

      CATCH cx_hrso_lock_fail INTO ex.
        str = ex->get_text( ).
        MESSAGE str TYPE 'S' DISPLAY LIKE 'E'.
    ENDTRY.


Потом можно создать свой класс исключений и переопределить метод get_text()....

Code:
CLASS cx_my_exception DEFINITION  INHERITING FROM cx_static_check.
* Все этого уже достаточно чтобы выбрасывать
* исключения этого типа :)
ENDCLASS.


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB