2009-03-06 2 views
6

내가 가끔 생각 기능에 대한 시도 - 캐치 것은, 매우 유용가있을 수있다 :C++의 함수 전체 예외 처리 - 나쁜 스타일입니까?

bool function() 
try 
{ 
    //do something 
} 
catch(exception_type & t) 
{ 
    //do something 
} 

그래서 질문의 첫 번째 부분 :이 스타일은 일반적인 경우에 나쁜 생각된다?

그리고 나는이 방법에 사용되는 구체적인 예 : 우리는 C와 C 코드의 꽤 많은 ++로 프로젝트를했다

합니다. 그리고 거기에 우리는 사용자 정의 예외 유형 (std :: exception 파생되지 않음)이 없습니다. XML 라이브러리를 통합하고 모든 유형의 예외를 캐스팅해야했습니다. 그래서 기본적으로 마지막 단계는 XML 라이브러리에서 모든 예외를 포착하여 변환하는 것입니다.

bool readEntity(...) 
try 
{ 
    while(...) 
    { 
     if(...) 
     { 
     //lot's of code... 
     } 
    } 
} 
catch(XMLBaseException & ex) 
{ 
    //create our exception and throw 
} 

내 생각이 같은 갔다 :

기능하기 전에 :

bool readEntity(...) 
{ 
    while(...) 
    { 
     if(...) 
     { 
     //lot's of code... 
     } 
    } 
} 

후 나는 명확하게 정의 유형에 한 가지 유형에서 파생 된 모든 예외를 변환하는 나의 의도를 국가와 우리는 계속 우리의 가로 스크롤 막대가없는 화면 (가로 스크롤 막대가 불량 함)

글쎄, 실제로 코드 검토 중 명확하지 않은 코드에 대해서는이 접근법에 대해 상당히 비판적이었다.

여러분의 의견을 듣고 싶습니다.

업데이트 : 리팩터링 기능은 옵션이 아닙니다. 그리고 실제로 그것은 좋은 편지였습니다.

+0

비슷한 질문 (중복되지는 않지만 흥미로울 수 있음) : http://stackoverflow.com/questions/335839/can-you-really-have-a-function-method-without-a-body- but -just-a-try-catch-block –

답변

12

실제로 함수 수준 try 블록의 유일한 이유는 생성자를위한 것입니다. 그렇지 않은 경우에는 그다지 구매하지 않는 다소 모호한 기능입니다.

bool readEntity(...) 
{ 
    try 
    { 
     while(...) 
     { 
     if(...) 
     { 
      //lot's of code... 
     } 
     } 
    } 
    catch(XMLBaseException & ex) 
    { 
     //create our exception and throw 
    } 
} 

당신은 수평 이동에 문제가있는 경우 다음 할 수있는 일이 코드를 분할하는 것입니다 : 그것은이 방법을 수행하는만큼 쉽습니다. try/catch는 복잡하며 숨겨진 것이 아니라 중첩 수준으로 나타내야합니다. 생성자에서

이 다른 문제입니다 : 이니셜 라이저 목록에 예외를 잡을 수있는 다른 방법이 없습니다 : 가능성이 많은 당신은 예외 중반 건설이있는 경우

물론
SomeClass::SomeClass(parameter p1, parameter p2) : Member1(p1), Member2(p2) 
try 
{ 
} 
catch(Exception &ex) 
{ 
    // handle and rethrow 
} 

,이 아니다 당신 로그 및 재실행을 제외하고 복구 할 수 있습니다 (생성자의 경우 어쨌든 재실행 될 것입니다). 당신의 객체는 아직 완벽하게 구축되지 않았으며, 당신이 실제로 그것을 할 수있는 것은 아무것도 없습니다. 유효하다고 믿을 수있는 유일한 것은 매개 변수입니다 (초기화에 실패하면 잘못된 매개 변수로 인한 것일 수도 있음).

이에 대한 설명은 GOTW을 참조하십시오.

4

예외를 재현하고 재 패키징하는 것은 좋지 않은 관행이 아니며, 외부 종속성의 노출을 최소화하므로 좋음입니다.

그러나 함수 수준 try-catch는 생성자 초기화를위한 것입니다. 코드에 몇 개의 수평 공백을 저장하는 것은 상대적으로 모호한 언어 기능을 사용할 가치가 없습니다. 중첩 된 코드를 정말로 리팩토링하는 것이 더 좋습니다.

0

그 함수는 true 또는 false를 반환 할 수 있도록 bool을 반환해야하지만 함수가 실패하고 bool이 success 플래그 이외의 다른 용도로 사용 된 경우 (순수한 C가 아닌 경우 나쁜 실행 임)이 함수는 throw해야합니다 발신자에게 신호를 보내면 작동하지 않습니다.

+0

함수 유형은 단지 예입니다. 나는 그것이 단지 생성 된 엔티티를 반환했다고 생각한다. 하지만 당신의 요점을 봅니다. – inazaruk

1

Herb Sutters GotW site에는 constructor/function try 블록의 일반적인 쓸데없는 점에 대해 좋은 토론이 있습니다.