Обработка исключений, не в состоянии понять :( - PullRequest
4 голосов
/ 01 мая 2011

Hya продвинутые пользователи SO,

Прежде всего, я новичок в C ++, так что извините, если я не проясню, что задаю вопрос.Я видел пример обработки исключений, но не смог понять, что здесь происходит: (

http://codepaste.net/zqsrnj или

enum ErrorCode {…}; // this is exception class
ErrorCode dispatcher() {
   try {
      throw; // what is thrown here in function?, if rethrow what is rethrown?
   }
   catch (std::bad_alloc&) {
      return ErrorCode_OutOfMemory;
   }
   catch (std::logic_error&) {
      return ErrorCode_LogicError;
   }
   catch (myownstdexcderivedclass&) {
      return ErrorCode_42;
   }
   catch(...) { // this will handle the above throw in try block of dispatcher
      return ErrorCode_UnknownWeWillAllDie;
   }
}

ErrorCode apifunc() {
   try {
      // foo() might throw anything
      foo();
   }
   catch(...) {
      // dispatcher rethrows the exception and does fine-grained handling
      return dispatcher();
   }
   return ErrorCode_Fine; // 
}

ErrorCode apifunc2() {
   try {
      // bar() might throw anything
      bar();
   }
   catch(...) {
      return dispatcher();
   }
   return ErrorCode_Fine;
}

Может кто-нибудь объяснить эту строку построчноили в целом, что здесь происходит, как проходит контроль? Любая помощь очень ценится, поэтому большое спасибо.

Ответы [ 2 ]

2 голосов
/ 01 мая 2011

apifunc() и apifunc2() переводят исключения в коды ошибок, используя функцию dispatcher().

По сути, происходит следующее: apifunc() (и аналогично apifunc2()) пытается вызватьфункция foo().Если foo() выдает исключение, то блок catch вызовет dispatcher(), чтобы получить код ошибки, соответствующий исключению, а затем вернет этот код ошибки.Если foo() не выбрасывает, apifunc() возвращает ErrorCode_Fine, что указывает на отсутствие ошибки.

dispatcher() работает путем повторного выброса последнего сгенерированного исключения, то есть одного foo() сгенерированного.dispatcher() затем проверяет, какое исключение было сгенерировано с использованием блоков catch, и возвращает правильный код ошибки.Например, если foo() бросил std::bad_alloc, то этот блок catch будет выполнен и вернет ErrorCode_OutOfMemory;.

Зачем кому-то это делать?

Исключения не обязательно являются двоично-совместимыми для разных компиляций (компиляторов, флагов компиляторов и т. Д.), Поэтому преобразование исключений в коды ошибок более переносимо через границы модулей.

1 голос
/ 01 мая 2011

Когда foo() выдает исключение во время его выполнения, исключение перехватывается в оболочке apifunc(), предложение catch которого вызывает метод dispatcher(). Там «текущее» исключение перебрасывается (это пустой оператор throw в методе dispatcher()) и перехватывается снова. Затем различные предложения catch (bad_alloc, logic_error, myownstdexcderivedclass ... возвращают отдельный код ошибки, который будет возвращен во внешний мир.

Последнее предложение catch(...) гарантирует, что не будет выдано никаких исключений вызывающим из apifunc().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...