2015-12-10 5 views
3

код выглядит следующим образом:C++ пытаются блоков и обработки исключений

int main() { 
    int a, b; 
    while (cin >> a >> b) { 
     try { 
      if (b == 0) 
       throw runtime_error("Can not divide zero!"); 
      if (a >= 100 || b >= 100) 
       throw range_error("a and b can not be over 100"); 
      cout << a/b << endl; 
     } catch(runtime_error err){ 
      cout << err.what() << endl; 
      cout << "\nTry again? Enter y or n" << endl; 
      char c; 
      cin >> c; 
      if (!cin || c == 'n') 
       break; 
     } 
     catch (range_error err2) { 
      cout << err2.what() << endl; 
     } 
    } 
    return 0; 
} 

Я обнаружил, что, когда я ввожу число больше 100, как указано в коде, range_error отбрасывается. Но я удивляюсь, почему он все еще показывает «Попробовать еще раз? Введите y или n» и будет функционировать точно так же, как первый блок catch. Как и во второй инструкции catch, нет никакого кода, указывающего пользователю вводить y или n. И если я удалю соответствующий код в первом заявлении catch, это сообщение не будет отображаться при возникновении range_error.

И, кстати, если блок try выбрасывает два runtime_errors, которые требуют различного процесса обработки, как программа сообщит, какую команду вывести запустить?

+2

'std :: range_error' является подклассом' std :: runtime_error', поэтому 'catch (std :: runtime_error)' ловит его тоже. Попробовали поймать в обратном порядке? – Biffen

+2

Есть ли причина, по которой вы поймаете свои исключения по стоимости? – SergeyA

+1

Оба gcc clang предупреждают об этом [Demo] (http://coliru.stacked-crooked.com/a/44c67613bf8902d0). – Jarod42

ответ

10

Вам необходимо поймать range_error, поскольку оно происходит от runtime_error. Ловля runtime_error первый также вытащите range_error.

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

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