LINUX.ORG.RU

exceptions сделать что-то в каждом из них

 ,


0

1

допустип есть такой код:

try
{
   doThing();
}
catch (const exceptionA& a)
{
   handleA();
}
catch (const exceptionB& b)
{
   handleB();
}
...

Как выполнить handleCommon() и для А и для В? Ну т.е. можно продублировать везде, что я сейчас и собираюсь сделать, просто хотел узнать, есть ли другой способ.

★★★★★
Ответ на: комментарий от anonymous

тебя ж спросили по сравнению с чем оно тормоз?

Да хотя бы с

switch(class->getType())
{
  case parent: break;
  case child: break;
}

Зачем ты прикидываешься дебилом?

Если у в данном контексте возникает вопрос «по сравнению с чем», то дебилом прикидывается его задающий.

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

Да хотя бы с

То есть пример с костылем в виде idшника — это единственное, что ты придумал? rtti не только для этого применяется.

И даже в этом случае, при добавлении очередного класса тебе придется писать очередную ветку, добавлять очередной id типа. Это, возможно, оправданно, если этот вызов у тебя 1000000 раз в секунду дергается.

/// разовые вызовы.
root.add_module<modA>( paramA ); // тут rtti. создадим модуль с типом modA 
root.add_module<modB>( paramB0, paramB1 ); // тут rtti. создадим модуль с типом modB 

/// где-то потом.
.......

/// разовые вызовы.
auto ma = root.module<modA>( ); // тут rtti. найдем экземпляр по его типу
auto mb = root.module<modB>( ); // и тут тоже
....
ma.callA1( )
ma.callA2( )
...
mb.callB1( )
mb.callB2( )

anonymous
()
Ответ на: комментарий от anonymous

То есть пример с костылем в виде idшника

Как по вашему работает rtti?

— это единственное, что ты придумал?

Ну придумайте что-то еще. Вы спросили в сравнении с чем, я вам дал ответ.

rtti не только для этого применяется.

И что по вашему это должно означать?

И даже в этом случае, при добавлении очередного класса тебе придется писать очередную ветку, добавлять очередной id типа.

О боже, при добавлении класса мне придется описать этот класс. Ужас.

Это, возможно, оправданно, если этот вызов у тебя 1000000 раз в секунду дергается.

В данном случае значительная разница будет видна уже на ГОРАЗДО меньшем количестве итераций. Тест написать осилите сами?

В любом случае, что вы будете делать, если поддержки rtti нет? К примеру на андроеде, или использовать stlport без rtti, или gnustl с поддержкой rtti.

andreyu ★★★★★
()
Ответ на: комментарий от anonymous
root.add_module<modA>( paramA ); // тут rtti. создадим модуль с типом modA 
root.add_module<modB>( paramB0, paramB1 ); // тут rtti. создадим модуль с типом modB 



А где тут rtti? Я вижу шаблонные объекты, унаследованные от общего предка.

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

О боже, при добавлении класса мне придется описать этот класс. Ужас.

тебе еще придется придумать уникальный ID и добавить его в твой switch. и так по количеству классов.

Тест написать осилите сами?

пфф..и вызывать 10000 раз в секунду? анахрена? rtti не для этого сделали.

К примеру на андроеде,

с r5 уже поддерживает. с разморозкой.

anonymous
()
Ответ на: комментарий от anonymous

с r5 уже поддерживает. с разморозкой.

Текущиая версия ndk-r10d. Но только в gnustl есть поддержка rtti, stlport по прежнему не умеет rtti.

пфф..и вызывать 10000 раз в секунду? анахрена? rtti не для этого сделали.

Это как-то отменяет тот факт, что простой свитч будет быстрее нативного rtti?

тебе еще придется придумать уникальный ID и добавить его в твой switch. и так по количеству классов.

Беда, как дальше жить.

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

Я вижу шаблонные объекты, унаследованные от общего предка.

неважно, что ты видишь. rtti там применяется при сохранении этих объектов и при последующем поиске.

anonymous
()
Ответ на: комментарий от andreyu

Беда, как дальше жить.

Понятно. Дальше хеловордов с 2 классами не писал. Тогда умолкаю, вырастишь поймёшь.

anonymous
()
Ответ на: комментарий от Oxdeadbeef

и другим может быть интересно, как проблема легко решается стандартными средствами в других языках?

Твоё решение ведь тоже сделает «handleCommon» при любой ошибке?

DarkEld3r ★★★★★
()
Ответ на: комментарий от Oxdeadbeef

Красивый, всеж язык, цуко!

Несколько раз пытался его постичь, но задачи не нашел :-/

anonymous
()
Ответ на: комментарий от anonymous

неважно, что ты видишь. rtti там применяется при сохранении этих объектов

Ненужно там для сохранения никакого rtti.

и при последующем поиске.

Зачем там нужен rtti? Спорим этот код заработает без поддержки rtti?

andreyu ★★★★★
()
Ответ на: комментарий от anonymous

Понятно. Дальше хеловордов с 2 классами не писал.

Баба Ванга, не узнаю вас в гриме.

Тогда умолкаю, вырастишь поймёшь.

Что я должен вырастить, что бы понять?

andreyu ★★★★★
()
Ответ на: комментарий от Gorthauer

А разве stlport не отправили на кладбище?

Может и отправляли, но в r10 он еще присутствует.

andreyu ★★★★★
()
Ответ на: комментарий от Oxdeadbeef

вот это короче твоей простины в пятсол миллионов раз. и быстрее на порядок. иди уже в лиспожопу, ладно?

anonymous
()
Ответ на: комментарий от DarkEld3r

Твоё решение ведь тоже сделает «handleCommon» при любой ошибке?

В приведеном коде, да (ТС вроде это хотел?). Но можно отфильтровать по кондишенам в HANDLER-BIND если нужно для конкретной ошибки.

Oxdeadbeef ★★★
()
Ответ на: комментарий от anonymous

вот это короче твоей простины в пятсол миллионов раз.

говнокод

и быстрее на порядок.

вранье

иди уже в лиспожопу, ладно?

ПНХ

Oxdeadbeef ★★★
()
Ответ на: комментарий от Oxdeadbeef

Ок ТСу надо выполнить handleCommon() только для exceptionА и exceptionB:

CL-USER> (define-condition my-error (error)
           ())
MY-ERROR
CL-USER> (define-condition a-error (my-error)
           ())
A-ERROR
CL-USER> (define-condition b-error (my-error)
           ())
B-ERROR
CL-USER> (defun test (&optional error)
           (handler-case
               (handler-bind ((my-error
                                #'(lambda (c)
                                    (format t "~&handleCommon: ~S~%" c))))
                 (progn
                   (format t "doThing~%")
                   (when error
                     (error error))
                   (format t "doAnotherThing~%")))
             (a-error ()
               (format t "handleA~%"))
             (b-error ()
               (format t "handleB~%"))))
TEST
CL-USER> (test)
doThing
doAnotherThing
NIL
CL-USER> (test 'a-error)
doThing
handleCommon: #<A-ERROR 200E941B>
handleA
NIL
CL-USER> (test 'b-error)
doThing
handleCommon: #<B-ERROR 21FCDCC3>
handleB
NIL
CL-USER> (test "another error")
doThing
; Evaluation aborted on #<SIMPLE-ERROR 22031C77>.
Oxdeadbeef ★★★
()
Ответ на: комментарий от Oxdeadbeef

Ок ТСу надо выполнить handleCommon() только для exceptionА и exceptionB:

Ок, спасибо.

DarkEld3r ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.