문제

C++의 예외는 호출 함수에 의해 포착될 필요가 없습니다(컴파일 시간 오류 없음).따라서 Java와 달리 try/catch를 사용하여 이를 포착할지 여부는 개발자의 판단에 달려 있습니다.

호출 함수의 try/catch를 사용하여 던져진 예외를 항상 포착할 수 있는 방법이 있습니까?

도움이 되었습니까?

해결책

아니요.

보다 예외 사양에 대한 실용적인 시각 안 되는 이유 때문에.

이를 "도움"할 수 있는 유일한 방법은 함수에서 발생할 수 있는 예외를 문서화하는 것입니다(예: 이를 선언하는 헤더 파일의 주석).이것은 컴파일러나 다른 것에 의해 시행되지 않습니다.해당 목적으로 코드 검토를 사용하십시오.

다른 팁

여기서는 예외를 사용하면 안 됩니다.이 기능을 사용하는 모든 곳에서 이를 예상해야 하는 경우 이는 분명히 예외적인 경우는 아닙니다!

더 나은 해결책은 함수가 이와 같은 인스턴스를 반환하도록 하는 것입니다.디버그 빌드에서(개발자가 방금 작성한 코드 경로를 실행한다고 가정) 작업 성공 여부를 확인하는 것을 잊어버린 경우 어설션을 받게 됩니다.

class SearchResult
{
  private:
    ResultType result_;
    bool succeeded_;
    bool succeessChecked_;

  public:
    SearchResult(Result& result, bool succeeded)
      : result_(result)
      , succeeded_(succeeded)
      , successChecked_(false)
    {
    }

    ~SearchResult()
    {
      ASSERT(successChecked_);
    }

    ResultType& Result() { return result_; }
    bool Succeeded() { successChecked_ = true; return succeeded_; }
}

귀하의 질문 범위를 벗어나서 이것을 게시하지 않는 것에 대해 토론했지만 Java에는 실제로 확인된 예외와 선택 취소된 두 가지 유형의 예외가 있습니다.기본적인 차이점은 다음과 같습니다. c[++], 확인되지 않은 예외를 잡을 필요는 없습니다.

좋은 참고를 위해 이 시도

크리스'라는 질문에 대한 가장 순수한 대답은 아마도 다음과 같습니다.

그런데 질문의 근원이 궁금합니다.사용자가 해야 할 경우 언제나 try/catch 블록으로 호출을 래핑하면 사용자가 호출한 함수가 처음부터 실제로 예외를 발생시켜야 합니까?

이는 문제의 코드 기반에 대한 추가 컨텍스트 없이는 답변하기 어려운 질문입니다.즉각적으로 생각해 보면, 여기서 가장 좋은 대답은 권장되는(코드의 전체 예외 스타일에 따라 다름) 공개 인터페이스가 try/catch를 수행하도록 기능을 마무리하는 것입니다. ~을 위한 사용자.코드에 처리되지 않은 예외가 없는지 확인하려는 경우 단위 테스트와 코드 검토가 아마도 가장 좋은 솔루션일 것입니다.

통화 함수에 따라 시도/캐치를 사용하여 항상 예외가 잡히는 것을 보장 할 수있는 방법이 있습니까?

나는 Java 군중이 - 나를 포함해 - 확인된 예외를 피하려고 합니다.그들은 다음을 사용하여 예외를 잡아야 하는 상황을 해결하려고 노력하고 있습니다. 런타임예외.

한 번 추가하려고 시도한 적이 있습니다. 동적 예외 사양 함수의 서명에 추가되었지만 언어가 정확성을 보장할 수 없었기 때문에 나중에 평가절하되었습니다.

C++11 이상에서는 이제 noout 지정자.
다시 말하지만, 서명이 throw되도록 표시된 경우에도 호출자가 서명을 처리해야 한다는 요구 사항은 없습니다.


컨텍스트에 따라 유형 시스템에 코딩하여 예외적인 동작을 처리하도록 할 수 있습니다.

보다: 표준::선택 사항 도서관 기본 사항의 일부로.

아니면 중요한 예외가 발생하기 시작할 수도 있습니다.물론 액세스 위반 예외는 다음과 같습니다. 잡다 사용자의 관심을 끌 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top