Существуют ли соглашения о том, какие номера ошибок я должен использовать в своем коде C ++?
Должен ли я начать с 1 или я должен выбрать большее число и идти оттуда?
Был запрошен пример, вот он:
#define ERR_EVERYTHING_IS_WRONG 42
try
{
throw ERR_EVERYTHING_IS_WRONG;
}
catch(int err)
{
//
}
Один из лучших способов — следовать стандартным соглашениям о различных ошибках в кодах C ++. Enum
например:
enum FILE_ERROR{
FILE_NOT_FOUND,
FILE_NO_ACCESS,
FILE_BUSY
};
поэтому в коде вы можете использовать FILE_NOT_FOUND в качестве номера ошибки, который равен 0. Таким образом, это позволяет легко понять, какой тип ошибки означает
Нет никаких правил, вы можете делать все, что захотите, если вы сохраняете логический способ его назначения.
Если вы выбираете 3
за неправильный ввод пользователя оставьте его только для этой ошибки, иначе вы очень скоро потеряетесь
В C ++ обычно 1 имеет успех как 0 и 0 как код ошибки, в отличие от C, где есть много функций, возвращающих 0 как успех (strcmp и т. Д.)
иногда это может сбивать с толку, особенно при взаимодействии с кодом C, однако я считаю, что это очень помогает читабельности.
if(cplusplus_function()) {...}
гораздо более читабельным, чем
if(!c_function()){ ... }
помните также, что у вас есть исключения для использования в C ++, и старайтесь не вкладывать if-s
Для 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
}
}
Вы не «выбрасываете» никакие числа, вы «выбрасываете» исключение, объект класса, производного от std::exception
,
Стандартные исключения содержат текст и на самом деле не содержат номер ошибки. Однако вы можете создавать разные классы для разных типов исключений и иметь разные обработчики catch в зависимости от того, какой тип исключения был выдан.