Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> реализация транспорта исключений 
V
    Опции темы
boostcoder
Дата 23.11.2010, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



всем привет.
представьте следующую ситуацию..
у вас есть некоторый удаленный объект, методы которого вы вызываете:
Код

struct type { // удаленный объект
   void method() {
      // ........
   }
};

а теперь представьте что в этом методе выброшено исключение. а, т.к. этот объект удаленный, вы об этом не узнаете. или, в лучшем случае, узнаете позже(в зависимости от велосипеда который каким-то макаром передаст на вашу сторону информацию об исключении). но это все не то.
хочу так:
Код

struct type { // удаленный объект
   void method() {
      throw std::runtime_error(...);
   }
};

...
// локальный объект
client.get<type>()->method(); // вот тут получить исключение

какие варианты реализации есть?

всем спасибо.


Это сообщение отредактировал(а) boostcoder - 23.11.2010, 08:59
PM WWW   Вверх
azesmcar
Дата 23.11.2010, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



boostcoder

Сериализовать исключение и отправить в виде обычного сообщения (тип, где произошло, ошибку...) и на клиентской стороне заново сгенерировать. Сказать легко, но определение базового класса исключений, которые могут покидать границу серверного приложения немного облегчит труд.

Код

// server pseudocode
try {
   handlers->execute(request->get_request_function());
} catch (rpc_exception& e) {
   response(serilize(e.type(), e.message(), e.line(), e.file()));
}

Код

// client pseudocode
if (!response->is_ok()) {
   switch (response->type()) {
      case "exception_type_1" : throw exception_type_1(response->message(), response->line(), response->file());
      // И так далее
   }
}

что-то вроде этого
PM   Вверх
boostcoder
Дата 23.11.2010, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



azesmcar, т.е. получается так, что вызов метода реализации должен происходить в try {} блоке. в catch блоке я определяю тип исключения(если нужно). этот тип должен содержать всю необходимую информацию(строка/файл/сообщение/тип). далее я сериализую эту информацию и отправляю вызывающей стороне.
вызывающая сторона в свою очередь получает от сервера ответ. и если тип ответа = исключение - тогда сгенерировать его локально.

...
PM WWW   Вверх
azesmcar
Дата 23.11.2010, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(boostcoder @  23.11.2010,  10:09 Найти цитируемый пост)
вызывающая сторона в свою очередь получает от сервера ответ. и если тип ответа = исключение - тогда сгенерировать его локально.

Да, но все это скрыто от пользователя. Пользователь просто вызывает удаленный метод и получает исключение.
PM   Вверх
boostcoder
Дата 23.11.2010, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(boostcoder @  23.11.2010,  10:09 Найти цитируемый пост)
вызывающая сторона в свою очередь получает от сервера ответ

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

Добавлено через 31 секунду
Цитата(azesmcar @  23.11.2010,  10:10 Найти цитируемый пост)
Да, но все это скрыто от пользователя. Пользователь просто вызывает удаленный метод и получает исключение. 

да да.
 я просто размышлял вслух smile 
PM WWW   Вверх
azesmcar
Дата 23.11.2010, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(boostcoder @  23.11.2010,  10:12 Найти цитируемый пост)
а вот с этим проблема.. по умолчанию все вызовы асинхронные. так же, вызываемый метод не обязан возвращать ответ. его можно просто вызвать, даже не передавая аргументов. а посылать ответ вызывающей стороне или нет, зависит от реализации задачи..вот.

да, но клиент когда нибудь должен запросить ответ от функции? Вот тогда и получит: либо ответ, либо исключение.
PM   Вверх
boostcoder
Дата 23.11.2010, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(azesmcar @  23.11.2010,  10:15 Найти цитируемый пост)
да, но клиент когда нибудь должен запросить ответ от функции?

нет smile 
все зависит от реализации логики.
PM WWW   Вверх
azesmcar
Дата 23.11.2010, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(boostcoder @  23.11.2010,  10:23 Найти цитируемый пост)
все зависит от реализации логики. 

а откуда тогда получать исключение? smile 
PM   Вверх
boostcoder
Дата 23.11.2010, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



собственно это можно реализовать следующим образом: вызывающая сторона по умолчанию находится в состоянии чтения. нужно сделать так, чтоб при возникновении исключения(вне зависимости от того посылается ли результат вызова обратно или нет) посылалось сообщение содержащее информацию об исключении.

Добавлено через 55 секунд
Цитата(azesmcar @  23.11.2010,  10:24 Найти цитируемый пост)
а откуда тогда получать исключение?


Цитата(boostcoder @  23.11.2010,  10:27 Найти цитируемый пост)
нужно сделать так, чтоб при возникновении исключения(вне зависимости от того посылается ли результат вызова обратно или нет) посылалось сообщение содержащее информацию об исключении. 


PM WWW   Вверх
boostcoder
Дата 23.11.2010, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(boostcoder @  23.11.2010,  10:27 Найти цитируемый пост)
нужно сделать так, чтоб при возникновении исключения(вне зависимости от того посылается ли результат вызова обратно или нет) посылалось сообщение содержащее информацию об исключении.

это все хорошо, но есть одно но: вызывающая сторона получит это исключение не в момент вызова удаленного метода, а позже. а вот когда - это зависит от многого.
PM WWW   Вверх
xvr
Дата 23.11.2010, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(boostcoder @  23.11.2010,  10:50 Найти цитируемый пост)
 вызывающая сторона получит это исключение не в момент вызова удаленного метода, а позже. а вот когда - это зависит от многого. 
У вызывающей стороны ДОЛЖНО быть четко оговоренное место (или места), где она может принять исключение. Исключение не должно сваливаться в поток исполнение в произвольном месте. Во первых - такое исключение невозможно логически привязать к вызову (т.к. вызов был произведен давным давно и вообще неизвестно какой именно), во вторых - такое исключение может сломать (и скорее всего и сломает) поток исполнения, т.к. он (поток) может не рассчитывать на то, что в этом месте вообще возможно исключение

Так что должна быть точка синхронизации - или сам вызов удаленного метода (при синхронном вызове), или какая то функция проверки (при асинхронном), даже если метод и не возвращает данных.
В принципе пользователь может и не позвать функцию проверки, но это значит, что его не интересует результат исполнения метода, а значит и возможные исключения (т.к. это тоже своего рода результат) тоже не интересуют

Кстати, DCOM требует, что бы все методы возвращали HRESULT - он туда складывает и свои собственные ошибки (сетевые)


PM MAIL   Вверх
jonie
Дата 23.11.2010, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



А я думал асинхронные операции бывают в виде:
а) callback при завершении, куда передается сложный объект, из которого можно узнать об успехе операции+получить описание ошибки. При этом не оговорено насчет в каком thread-е этот калбэк вызывается
б) опрашивание об окончании операции. По сути своей частный случай обертки над (а). Тут callback вызывается внутри "ядра" и сложный объект сохраняется куда-то там, чтобы при опросе его вернуть.

Замечу, что я не вижу причин для генерации ошибки ни в случае а) ни в случае б). На мой взгляд вполне допустимо что клиент самостоятельно решает что ему делать в случае ошибки... также отпадает вопрос "когда генерировать исключение".


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
boostcoder
Дата 23.11.2010, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(xvr @  23.11.2010,  13:49 Найти цитируемый пост)
У вызывающей стороны ДОЛЖНО быть четко оговоренное место (или места), где она может принять исключение. Исключение не должно сваливаться в поток исполнение в произвольном месте. 

понимаю.

Цитата(xvr @  23.11.2010,  13:49 Найти цитируемый пост)
во вторых - такое исключение может сломать (и скорее всего и сломает) поток исполнения, т.к. он (поток) может не рассчитывать на то, что в этом месте вообще возможно исключение

ага.

Цитата(xvr @  23.11.2010,  13:49 Найти цитируемый пост)
В принципе пользователь может и не позвать функцию проверки, но это значит, что его не интересует результат исполнения метода, а значит и возможные исключения (т.к. это тоже своего рода результат) тоже не интересуют

я к такому же выводу пришел.

Цитата(jonie @  23.11.2010,  21:16 Найти цитируемый пост)
Замечу, что я не вижу причин для генерации ошибки ни в случае а) ни в случае б). На мой взгляд вполне допустимо что клиент самостоятельно решает что ему делать в случае ошибки... также отпадает вопрос "когда генерировать исключение". 

Вы правы. из-за "туманности" в принципах и реализации, решил отказаться от подобной возможности.

всем спасибо. вопрос закрыт.

PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0651 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.