0

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

// gradedUnits and totalGrades are both of type int 
if (gradedUnits == 0) { 
    return 0; 
} else { 
    return totalGrades/gradedUnits; //call stack points to this line 
} 

однако Visual Studio выскакивает эту ошибку:

Unhandled exception at 0x001712c0 in DSA_asgn1.exe: 0xC0000094: Integer division by zero.

И трассировка стека указывает на строку, указанную в коде.

UPDATE: I may have just been doing something silly here. While messing around trying to get VS to pay attention to my debug breakpoints, I rebuilt the solution and the exception isn't happening any more. It seems likely to me that I was stopping in the middle of a debug session and resuming it, when I thought I was starting new sessions.

Thanks for the responses. Would it be appropriate here to delete my question since it's resolved and wasn't really what I thought it was?

Похоже, что VS может просто сделать это с любым делением целого числа, не проверяя, возможно ли разделение на ноль. Нужно ли мне улавливать это исключение, хотя код никогда не сможет его выбросить? Если да, то как лучше всего это сделать?

Это назначение, которое указывает VS 2005/2008 на C++. Я бы предпочел не делать что-то более сложное, чем мне нужно, но в то же время мне нравится делать все по возможности, где это возможно.

+0

Деление на ноль _looks_ невозможно здесь. Но мы могли бы использовать больше контекста. Может ли другой поток изменять gradedUnits? Вы бы поставили байты/инструкции сборки, которые компилятор включил? Возможно, оптимизатор делает что-то неожиданное? –

+0

Это исключение во время выполнения. Попробуйте запустить его в отладчике и увидеть значения –

+0

Вы, кажется, смущены тем, как работают исключения. Я уверен, что вы пришли из фона Java? Это исключение выбрасывается во время выполнения, когда вы делите на ноль, а не на время компиляции, чтобы сообщить вам о возможном исключении, которое может произойти. Таким образом, хотя это исключение * должно никогда не появляться, оно действительно есть, и вам нужно исследовать. –

ответ

-1

Оказывается, эта проблема была вызвана код, который я первоначально имел, не имевшей проверку деления на ноль, как показано здесь:

return totalGrades/gradedUnits; 

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

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

0

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