2014-09-18 6 views
-2

C++ 코드에서 사용해야하는 오류 번호에 대한 규약이 있습니까?C++ 오류 번호 할당 - 허용되는 표준이 있습니까?

1부터 시작합니까? 아니면 높은 번호를 고르고 거기에서 가야합니까?

그래서 여기있다, 요청 된 : 어떤 규칙이 없습니다

#define ERR_EVERYTHING_IS_WRONG 42 

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

어떤 종류의 오류 번호가 표시됩니까? 예를 들어 질문을 명확히하는 것이 좋습니다. – Csq

+2

42를 사용하지 마십시오. 결코 오류가 아닙니다. – CashCow

+0

만약 당신의 질문을 올바르게 이해하고 있다면, C++에서 다소 받아 들여지는 표준이 있습니다. 예외를 사용하십시오. 그것이 그들이 원하는 것입니다. (하지만 질문에 대한 대답은 실제로 대답이 아니며, 실제로 오류가 아닌 것을 반환하는 것에 대해 실제로 묻고있을 수도 있습니다.) – hvd

답변

1

하나가있는 경우-의 중첩을 피하기 위해 노력보다 더 많은 읽을 수 있습니다 C++ 코드의 다른 오류 규칙에 대한 표준을 따릅니다. 열거 형

예 :

enum FILE_ERROR{ 
FILE_NOT_FOUND,   
FILE_NO_ACCESS, 
FILE_BUSY 
}; 

코드에서 FILE_NOT_FOUND는 오류 번호 0으로 사용할 수 있습니다. 따라서 어떤 오류 유형이 무엇을 의미하는지 쉽게 알 수 있습니다.

+0

아니요, FileNotFound는 True 또는 False가 아닌 다른 부울입니다. C++에서 enum 클래스를 사용하는 – CashCow

+0

은 enum 유형을 int로 변환하기 위해 int에 static_cast를 사용해야합니다. –

+0

enum 요소 유형은 정수 const입니다. 따라서 변환하거나 다시 캐스팅 할 필요가 없습니다. –

1

, 당신은 당신이 아니라 당신이 할당 할 수있는 논리적 인 방법을 유지으로 원하는대로 할 수 있습니다. 당신이 나쁜 사용자 입력을 3을 선택한 경우에만 해당 오류를 위해 그것을 유지하거나 당신이 정말로 곧

C에서
1

을 잃은거야 경우

는 ++은 C에 대한 오류 코드, 가능성으로 성공으로 1과 0을하는 것이 일반적이다 (strcmp, etc ...)

때때로 이것은 특히 C 코드와 상호 작용할 때 혼란 스러울 수 있습니다. 그러나 이것은 많은 가독성을 돕습니다.

if(cplusplus_function()) {...} 

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

당신이 C++에서 활용에 대한 예외를 가지고도 기억하고 가장 좋은 방법의

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(); 
    } 
} 

또는 간단 :

class my_error { 
}; 

int main() { 
    try { 
    throw my_error(); 
    } catch (const my_error& e) { 
    //TODO handle my_error 
    } 
} 
: 표준 라이브러리없이 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(); 
    } 
} 

사용

+0

표준 라이브러리를 구현하지 않습니다. (나는 당신이 그것이 내 실수이거나 시간 낭비라고 생각할 것이다. 그러나 나는 나의 코드와 관련된 몇 가지 중요한 이유가 없다고 확신한다.) 그래도 고마워. – Beakie

+0

* 표준 라이브러리를 구현하지 않습니다. * 그 의미는 무엇입니까? 표준 라이브러리를 사용하고 있지 않습니까? 어쨌든'std :: runtime_error'를 상속받지 않고 커스텀 예외 클래스를 생성 할 수 있습니다. – Csq

+0

표준을 사용하지 않습니다. 아니 전혀 포함! 미친, 알아요 :) 나는 게시 할 때마다 들었습니다. -/ – Beakie

0

숫자를 "던지지"마십시오. std::exception에서 파생 된 클래스의 개체 인 예외가 throw됩니다.

표준 예외에는 텍스트가 포함되어 있으며 실제로 오류 번호가 없습니다. 그러나 다른 유형의 예외에 대해 다른 클래스를 만들 수 있으며 어떤 예외 유형이 던져 졌는지에 따라 다른 catch 핸들러를 가질 수 있습니다.

+0

상단의 예가 예상대로 작동합니까? – Beakie

+0

예, 작동하지만 int를 전달하는 것은 "허용 된 표준"이 아닙니다. – CashCow