2009-12-07 2 views
2

Я пытаюсь поймать деления на ноль попытки:Как поймать эту ошибку? [C++]

int _tmain(int argc, _TCHAR* argv[]) 
{ 
int a = 5; 
try 
{ 
int b = a/0; 
} 
catch(const exception& e) 
{ 
    cerr << e.what(); 
} 
catch(...) 
{ 
    cerr << "Unknown error."; 
} 
    cin.get(); 
return 0; 
} 

и в основном это не работает. Любой совет, почему? Спасибо. P.S. Любой шанс, что в будущем код может быть помещен между тегами [code] [/ code] вместо четырех пробелов?

+0

Re your PS: Markdown не является BBCode и не использует [код]. Вы можете вставить свой код в редактор, выделить его, а затем Ctrl + K до автоматического отступа. –

ответ

7

Деление на ноль не вызывает каких-либо исключений в стандартном C++, вместо этого оно дает вам неопределенное поведение. Как правило, если вы хотите поднять исключение вам нужно сделать это самостоятельно:

int divide(int a, int b) { 
    if (b == 0) { 
     throw DivideByZero; // or whatever 
    } 
    return a/b; 
} 
+0

Спасибо, ребята. P.S. Есть ли причина, по которой комментарий должен составлять не менее 15 символов? –

+0

Pseudo Spam Prevention, по-видимому ... –

+0

Лично я бы сделал этот шаблон и назову его checked_divide. –

2

Лучше всего было бы проверить, если делитель равен 0.

C++ не проверяет деление на ноль , Краткая дискуссия может быть найдена here.

+0

Интересно, однако, atch сообщает, что он не получил никакого исключения, что не совпадает с вашей ссылкой ... hmm – jpinto3912

+1

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

2

В настоящий момент вы создаете код для Windows (данные: _tmain и _TCHAR не являются переносимыми C++).

Если вы хотите получить решение, которое работает только на Windows, то вы можете использовать так называемые «структурированная обработка исключений» (SEH):

Тем не менее, это только МС-Функции персонального число рейнольдса Если вы полагаетесь на исключение, которое бросается на эту ошибку, тогда потребуется значительное время, чтобы изменить код позже, если вы хотите, чтобы он работал на других платформах.

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

Смежные вопросы