Что означает: бросить 0 сделать / значит? Это плохо"? - PullRequest
8 голосов
/ 13 апреля 2010

Контекст

Я наткнулся на некоторый код, например:

if( Some_Condition ) throw 0;

Я немного погуглил и нашел несколько других фрагментов кода, использующих эту странную форму throw 0.

Полагаю, можно было бы поймать это как:

catch(const int& e) 
{  }

Или это NULL ptr? быть пойманным как void*?

Вопрос

Что это throw 0 делает? Это что-то особенное?

Моим обычным предпочтением было бы выбрасывать что-то, что (или происходит от) std::exception. Так что для меня это выглядит "плохо". Это "плохо"?

Ответы [ 3 ]

15 голосов
/ 13 апреля 2010

Обычно бросок может бросить любой тип, любой, который вам нужен, чтобы поймать его этим типом или его базовым типом.

Так что технически это юридический код, но ...

это плохой код: Вы должны всегда получать свои исключения из std::exception или хотя бы из некоторого класса, который предоставляет полезную информацию об ошибке, а не просто число. Но вывод из std::exception является правильным способом, поскольку он позволяет использовать самый верхний catch(std::exception const &e) и получить хотя бы некоторую информацию об ошибке.

4 голосов
/ 13 апреля 2010

Это не особенное, вы можете использовать int как класс исключений.

Это считается плохим стилем, потому что класс исключения может рассказать больше о том, что на самом деле произошло.

2 голосов
/ 13 апреля 2010

Это инт.Это «плохо», так как бросок 0 делает код нечитаемым или намекает на то, что кто-то использует исключения в качестве системы возврата значений.(Это в основном та же проблема, что и магическое число внутри кода)

NULL определяется как ((void *)0).Если компилятор видит 0, это означает int.Он может быть автоматически приведен к чему-то другому, но только если есть причина (например, присвоение double).Строка throw 0 не дает такой причины, поэтому бросается int.

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