Плохо перебрасывает компиляции, но вылетает во время выполнения - PullRequest
2 голосов
/ 21 августа 2009

Следующий код скомпилируется, но завершится с ошибкой во время выполнения:

int main() {

    try {
        throw;
    }
    catch(...){
        cout<<"In catch";
    }
     return 0;

}

Результат: «Необработанное исключение в 0x7c812a5b в hello.exe: исключение Microsoft C ++: [rethrow] @ 0x00000000»

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

Ответы [ 7 ]

5 голосов
/ 21 августа 2009

Вероятно, миллионы ошибок могут быть обнаружены компиляторами, если разработчики компиляторов вложат в них достаточно работы. Но эти авторы компиляторов должны принять решение о том, стоит ли эта работа. В этом случае они решили нет (и я с ними согласен).

5 голосов
/ 21 августа 2009

из стандарта C ++ (15.1.8)

Если в настоящее время не обрабатывается ни одно исключение, выполнение выражения броска без вызовов операндов std :: terminate ()

В соответствии со стандартом и четкой семантикой компилятор может соответствовать только этому.

3 голосов
/ 21 августа 2009

Не так просто. Вы могли бы вызвать эту функцию из блока catch в какой-то другой функции.

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

2 голосов
/ 21 августа 2009

Просто потому, что код законен. То же самое можно сказать о:

int* p=0;
*p = 0;

и тысячи других примеров. Это законно, но очень неправильно.

2 голосов
/ 21 августа 2009

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

void handleXExceptions()
{
   try {
      throw;
   } catch (XA&) {
      ...
   } catch (XB&) {
      ...
   } catch (X&) {
      assert("Update handleXExceptions" == NULL); 
   }
}

void f() {
   try {
      ...
   } catch (X&) {
      handleXExceptions();
   }
}

void g() {
   try {
      ...
   } catch (X&) {
      handleXExceptions();
   }
}
0 голосов
/ 21 августа 2009

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

0 голосов
/ 21 августа 2009

Откуда ему знать, что вызывающая функция не поймает исключение?

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