2012-12-29 3 views
1

예외 및 오류 코드가있는 C++ 파일 라이브러리를 작성했습니다. 프로그램이 실행 중일 때 예외를 비활성화 할 수 있습니다. 이 경우 사용자는 오류 코드를 확인해야합니다. 물론 예외를 throw 할 때 호출 된 함수가 반환되기 전에 예외가 발생하기 때문에 오류 코드가 반환되지 않습니다. 현재 비활성화 된 경우에도 예외가 throw 될 수 있습니다 (버그). 나는 곧 그 문제를 해결할 것이다. 누군가 예외와 오류 코드를 모두 가지고 있다고 생각합니다. 나는 그와 동의하고 나는 오류 코드를 제거하고 더 많은 오류 정보를 가진 라이브러리 파생 사용자 정의 예외를 던져 버릴거야. 그러나 나는 망설이다. 성능상의 이유로이 하이브리드 방식을 선호합니다. 이것은 내가 생각하고있는 일이다 : 예외 던지기와 에러 코드를 유지하면서 예외 던지기는 런타임 대신에 컴파일 타임에 매크로를 통해 사용할 수 없다.성능을 위해 C++ 라이브러리에 오류 코드 옵션이 있습니다.

ELMAX_EXCEPTION가 아닌 경우 사용자는 공통의 설정 파일

#define ELMAX_EXCEPTION 1 

int Write(std::wstring str) ELMAX_THROW_OR_NOT; 

는 2

// under C++11 compiler 
int Write(std::wstring str) noexcept; 

// under C++98 compiler 
int Write(std::wstring str) throw(); 

중 하나를 확장 할 것 추적 코드에 다음과 같은 정의하는 경우 정의되거나 0이면 매크로는 확장되지 않습니다.

int Write(std::wstring) ; 

내가 이렇게 할 이유는 더 나은 등의 기능을 최적화 할 수 있습니다 (예외) 스택 풀기 코드를 생성하는 컴파일러와 컴파일러를 가지고 있지의 성능 향상을 원하는 라이브러리 사용자를위한 것입니다. 내 C + + 파일 라이브러리는 C 파일 API를 사용하고 예외를 던질 수있는 유일한 것은 nothrow을 추가하려는 새로운 키워드입니다. UTF-8 코드는 예외를 던질 수 (언급 한 바와 같이) 나는 순수한 예외 접근 방식이나 하이브리드 접근 방식을해야하는 경우

char *parr = new (nothrow) char[num]; 

if(parr==NULL) 
    // handle it either through error code or throw exception (if enabled) 

이 친절하게 내 라이브러리 오류에 대해 알려 주시기 바랍니다 (도 변경해야합니다). 고맙습니다.

+0

정말 당신이 생각하고있는 라이브러리의 종류에 달려 있습니다. 그리고 그것은 구현 (어떤 컴파일러, 어떤 운영 체제)에 의존 할 수 있습니다. 어쩌면 http://programmers.stackexchange.com/가 더 나은 곳이지만 더 구체적이어야합니다. "한 가지 크기가 모두 적합"할 수는 없습니다. I/O 라이브러리의 경우 병목 현상이 실제 시스템 콜 범위 내에있을 가능성이 있으므로 예외를 최적화하지 않아도됩니다. –

+0

이것은 내 라이브러리에 대한 기사 링크 : [텍스트 및 이진 파일 API의 통합] (http://www.codeproject.com/Articles/465434/Unification-of-Text-and-Binary-File-APIs)입니다. 그것은 오픈 소스와 휴대용 C++ 라이브러리입니다. 필자는 크로스 플랫폼 XML 라이브러리 (아직 작성되지 않음) 용으로이 파일 라이브러리를 작성했습니다. 이 글을 쓸 때, 나는 성능을 염두에두고있다 : 나는 XML 라이브러리를 최대한 빨리 원한다. –

+0

가능한 중복 [예외 및 오류 코드 : 올바른 방법으로 혼합] (http://stackoverflow.com/questions/5805410/exceptions-and-error-codes-mixing-them-the-right-way) –

답변

0

라이브러리를 통해 원하는 작업에 따라 다릅니다. 분명히 예외는 디자인 관점에서 볼 때 더 뛰어나지 만 몰입 형 3D 게임과 같은 일부 종류의 앱에서는 종종 예외가 발생하는 경우가 많습니다.