2013-01-14 2 views
0

여러 SDK가 융합 된 특수 장치를 제어하는 ​​C++ 코드를 작성하고 있습니다. 내 코드 모양은 다음과 같습니다절차 적 하드웨어 프로그래밍을위한 오류 처리 기술

#define sdk1SafeCall(err) __sdk1SafeCall(err,__FILE__,__LINE__) 

int errorcode = 0; 
sdk1SafeCall(sdk1_InitializeDevice()); 
errorcode=sdk2_InitializeDevice(); 
errorcode=sdk3_InitializeDevice(); 

if (some_parameter) 
{ 
    errorcode=sdk2_readDevice(true); 
} 
else 
{ 
    errorcode=sdk3_writeDevice(); 
} 
label again: errorcode=sdk1_readDevice(); 
if (error) goto again; 

errorcode=close_everything(); 

사용 매개 변수는 제어 흐름을 재정렬합니다. 내 현재 방법은 cudaSafeCall과 같은 것을 사용하여 오류 코드를 감싸고 종료합니다. 어떻게 해야할지 모르겠지만 이러한 오류에 대한 자세한 설명이나 복구 방법 (예 : goto 예제)을 저장할 위치입니다. 결국 코드는 정말 지저분 해 보입니다.

편집

가끔 래퍼와 오류를 처리 않습니다.

+0

어쨌든 errorcode의 값을 실제로 읽지는 않으므로 코드를 작성하고 똑같은 코드 구현을 구현할 수 있습니다. –

+0

@PeteFordham 나는 그들과 어떻게 해야할지 모른다. 내 실제 구현에서는'sdk1SafeCall (sdk1_readData())'와 같이 CUDA와 같이 숫자, __FILE__ 및 __LINE__을 인쇄합니다. – Mikhail

답변

1

오류 안전 코드를 작성하는 것은 어렵습니다. 의사 코드에서는 실제로 오류를 처리하지 않습니다. 오류 코드는 "close_everything()"의 결과를 가지며, 다른 모든 것이 잘못되어도 성공할 수 있습니다.

C++에서 이런 종류의를 해결하는 일반적인 방법은 각각의 "리소스"(예 : "장치")에 대한 객체 및 throw을 가지고있는 exception 뭔가 당신이 회복을 기대하지 않는 것이 잘못되면 . try/catch 블록에 전체 함수 [또는 외부 함수 집합]을 래핑하십시오.

물론 "실패했습니다."(예 : 네트워크 포트에서 읽으려고 시도 할 때 사용할 수있는 데이터가 없어서 시간 초과가 발생하면 예외가 발생하지 않습니다.) 반환 값을 사용해야합니다.

리소스를 처리하기 위해 객체를 사용하려면주의 깊게 코드를 설계해야하며, 특히 소멸자가 예외 처리 후에 잘 수행되도록하십시오. 생성자에서 예외를 던지면 물건을 남겨 두지 마십시오. 누수가 발생하는 것과 같습니다.

자연스럽게 다른 솔루션이 있습니다. 결국 프로그래밍을 말하는 것이므로 항상 적어도 11 가지 다른 방법으로 문제를 해결해야합니다.

+0

뭔가를 해결하는 C++ 11 방법이 있습니까? – Mikhail

+0

내가 위에서 설명한 것은 일반적인 C++ 방법입니다. C++ 11은 여기에서 도움을 많이 주겠다고 생각하지 않습니다. "여전히 오류가 있고 예외가 발생하면 어딘가에 있습니다. 몇 가지 통화 수준을 낮추고 예외를 잡으십시오. " 그것을 완전히 설명하기 위해 많은 페이지의 텍스트가 필요합니다. 유감 스럽지만 그 설명이 웹에서 검색됩니다 - 거기에 있습니다 - 또는 안전한 방법으로 C++을 작성하는 방법을 설명하는 책을 구입하십시오 . 구체적인 질문이 있으시면 기꺼이 답변 드리겠습니다 만,이 방법에 대해 모두 설명하지는 않겠습니다 ... –

+0

오류가 발생할 경우 수행하려는 작업에 따라 달라질 수 있습니다. - "쉬운"선택은 메시지를 인쇄하고 종료하는 것입니다. 하지만 항상 좋은 대안은 아닙니다. "종료하고 메시지를 인쇄하십시오"가 좋은 선택 인 경우 오류를 확인하는 매크로 또는 함수를 갖는 것이 다른 선택입니다. –

관련 문제