Распределение номера ошибки C ++ — есть ли принятые стандарты?

Существуют ли соглашения о том, какие номера ошибок я должен использовать в своем коде C ++?

Должен ли я начать с 1 или я должен выбрать большее число и идти оттуда?

Был запрошен пример, вот он:

#define ERR_EVERYTHING_IS_WRONG 42

try
{
throw ERR_EVERYTHING_IS_WRONG;
}
catch(int err)
{
//
}

-2

Решение

Один из лучших способов — следовать стандартным соглашениям о различных ошибках в кодах C ++. Enum

например:

enum FILE_ERROR{
FILE_NOT_FOUND,
FILE_NO_ACCESS,
FILE_BUSY
};

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

1

Другие решения

Нет никаких правил, вы можете делать все, что захотите, если вы сохраняете логический способ его назначения.

Если вы выбираете 3 за неправильный ввод пользователя оставьте его только для этой ошибки, иначе вы очень скоро потеряетесь

1

В C ++ обычно 1 имеет успех как 0 и 0 как код ошибки, в отличие от C, где есть много функций, возвращающих 0 как успех (strcmp и т. Д.)

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

if(cplusplus_function()) {...}

гораздо более читабельным, чем

if(!c_function()){ ... }

помните также, что у вас есть исключения для использования в C ++, и старайтесь не вкладывать if-s

1

Для try-catch не используйте цифры! Используйте класс, полученный из стандартного класса исключений. Пример:

#include <stdexcept>

class my_error : public std::runtime_error {
public:
explicit my_error(const std::string& what_arg) : std::runtime_error(what_arg) {};
};

Использование (Coliru):

#include <iostream>

int main() {
try {
throw my_error("You can even pass a string here!");
} catch (const my_error& e) {
std::cerr << e.what();
}
}

Или проще: используйте std::runtime_error

#include <stdexcept>
#include <iostream>

int main() {
try {
throw std::runtime_error("Error happened");
} catch (const std::runtime_error& e) {
std::cerr << e.what();
}
}

Без стандартной библиотеки:

class my_error {
};

int main() {
try {
throw my_error();
} catch (const my_error& e) {
//TODO handle my_error
}
}
1

Вы не «выбрасываете» никакие числа, вы «выбрасываете» исключение, объект класса, производного от std::exception,

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

0
По вопросам рекламы [email protected]