Текущее время: Пт, июл 04 2025, 20:30

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: Google [Bot]


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

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