문제

에서는 C++,나를 잡으려고 노력하고는 모든 형식의 예외에서 하나 catch(아 catch(Exception) C#).어떻게 하는 것입니까?그리고 무엇보다,어떻게 하나를 잡을 나누기로 예외?

도움이 되었습니까?

해결책

catch (...)
{
   // Handle exceptions not covered.
}

중요한 고려 사항:

  • 더 나은 방법을 잡을 것이 특정 형식의 예외할 수 있는 실제로 복구에서와는 반대로 가능한 모든 예외가 있습니다.
  • catch(...)도 잡을 특정 시스템에 심각한 수준 예외(에 따라 변화하는 컴파일러)당신은 당신이 당신을 복구 할 수 있으로부터 신뢰성있게.을 잡는 그들을에서는 이 방법은 다음 그들을 삼키고 지속적인 일으킬 수 있는 더 심각한 문제에서 귀하의 프로그램입니다.
  • 상황에 따라할 수 있을 사용하도록 허용 catch(...)를 제공하고,예외가 다시 발생합니다.이 경우에,당신은 모든 현지에서 유용한 상태 정보를 다시 던져을 제외할 수 있도록 전파니다.그러나 당신이해야에 읽 RAII 패턴 선택하는 경우 이 경로입니다.

다른 팁

당신 을 사용하고 싶는 캐치(...)(i.ecatch 과 생략)지 않는 한 당신이 정말로 확실히,대부분의 증명할 필요가 있습니다.

그 이유는 그 일부의 컴파일러(Visual C++6 이름을 가장 일반적인)또한 다음과 같은 오류가 발생 segmentation faults 및 기타 정말 나쁜 조건으로 예외할 수 있는 기꺼이 처리하여 캐치(...).이것은 매우 나쁘지 않기 때문에 당신 볼 충돌을 더 이상입니다.

그리고 기술적으로,네,잡을 수 있습니다 또한 사단에 의해 제로(당신이해야 할 것이"유래"위한 것),하지만 당신은 정말이 있어도 피해야 한다 만들기 같은 부문에서 첫 번째 장소입니다.

대신 다음과 같이 하십시오.

  • 는 경우에 당신은 실제로 어떤 종류의 제외(s)을 기대,그 유형과 더고
  • 필요하신 경우에는 예외를 자신을 잡을 필요가있는 모든 예외 당신이 던져,이러한 예외에서 파생되는 std::exception(으로 아담 제안 관통)고합니다.

는 경우 윈도우에서하고 처리해야 하는 오류를 다음과 같으로 나누기로 액세스 위반이 사용할 수 있는 구조적 예외 번역가.다음의 내부에 습득할 수 있습 c++예외:

void myTranslator(unsigned code, EXCEPTION_POINTERS*)
{
    throw std::exception(<appropriate string here>);
}

_set_se_translator(myTranslator);

참고 코드는 무엇을 말할 것이 오류가 있었다.또한 필요하신으로 컴파일/EHa 옵션(C/C++->코드 Generatrion->사용 C/C++예외=예 SEH 예외).

면 되지 않는 체크 아웃에 대한 문서[_set_se_translator 를](http://msdn.microsoft.com/en-us/library/5z4bw5h5(VS.80).aspx)

는 경우를 잡는 모든 예외를 포함 OS 사람은 정말 무엇이 필요,당신은 필요하에서 살펴보고 컴파일러와 OS.예를 들어,윈도우에서 당신은 아마"__도"키워드 또는 컴파일러 스위치"를 만들기 위해 시도/을 잡을"잡을 SEH 예외입니다.

모든 사용자 지정외 클래스를 상속에서는 std::예외에,당신은 단순히 잡는 std::예외는 아니다.여기에 몇 가지 예를 들어 코드:

class WidgetError
    : public std::exception
{
public:
    WidgetError()
    { }

    virtual ~WidgetError() throw()
    { }

    virtual const char *what() const throw()
    {
        return "You got you a widget error!";
    }
};

C++에서 이 표준을 정의하지 않 나누기로,예외 및 구현하지 않는 경향이 있고 그들을 던져.

할 수 있습은 물론,사용 catch (...) { /* code here */ }, 지만,그것은 당신이 원하는 무엇을 할 수 있다.C++에서 당신은 결정적 소멸자(도 없는 완 쓰레기),그래서 당신이 원하는 경우를 닦고,올바른 것을 사용하는 것입 RAII.

예를 들어.는 대신:

void myfunc()
{
    void* h = get_handle_that_must_be_released();
    try { random_func(h); }
    catch (...) { release_object(h); throw; }
    release_object(h);

}

다음과 같은 것:

#include<boost/shared_ptr.hpp>

void my_func()
{
    boost::shared_ptr<void> h(get_handle_that_must_be_released(), release_object);
    random_func(h.get());
}

자신 만의 클래스를 만들과 함께 소멸자를 사용하지 않는 경우 합니다.

만약 내가 정확하게 기억(그것은 이후 나는 보았 C++),제가 생각하는 다음을 할 수 있습니다.

try
{
 // some code
}
catch(...)
{
 // catch anything
}

고 빠른 google(http://www.oreillynet.com/pub/a/network/2003/05/05/cpluspocketref.html)는 것을 증명하는 나에게 맞습니다.

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