할 수 있는 방법을 잡는 모든 형식의 예외에서 하나 catch 블?
-
09-06-2019 - |
문제
에서는 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)는 것을 증명하는 나에게 맞습니다.