문제

이 질문은 이미 여기에 답이 있습니다.

  try {
        int* p = 0;
        *p = 1;
    } catch (...) {
        cout << "null pointer." << endl;
    }

이런 예외를 포착하려고했지만 작동하지 않습니다. 도움이되지 않습니까?

도움이 되었습니까?

해결책

C ++에는 "NULL 포인터 예외"와 같은 것은 없습니다. 당신이 잡을 수있는 유일한 예외는 명시 적으로 던져진 예외입니다. throw 표현식 (Pavel이 언급 한 바와 같이 일부 표준 C ++ 예외는 표준에 의해 본질적으로 던져졌습니다. operator new, dynamic_cast 등). C ++에는 다른 예외가 없습니다. Dereferencing null pointers, Zero 등의 분할 등 C ++에서 예외를 생성하지 않으면 생성됩니다. 정의되지 않은 행동. 예외를 원한다면 이러한 조건을 수동으로 감지하고 수행하는 것은 자신의 책임입니다. throw 명시 적으로. 그것이 C ++에서 작동하는 방식입니다.

당신이 찾고있는 다른 것처럼 보이는 것은 C ++ 언어와 관련이 있지만 특정 구현의 기능과 관련이 있습니다. 예를 들어 Visual C ++에서 시스템/하드웨어 예외는 C ++ 예외로 "변환"될 수 있지만이 비표준 기능에 첨부 된 가격이 있으며 일반적으로 지불 할 가치가 없습니다.

다른 팁

당신은 할 수 없습니다. 널리 포인터를 중심으로하는 것은 시스템입니다.

Linux에서 OS는 응용 프로그램에서 신호를 제기합니다. 보세요 csignal 신호를 처리하는 방법을 확인합니다. 하나를 "잡기"하려면 SIGSEGV. 여기에서 프로그램을 우아하게 종료하기 전에 몇 가지 정보를 인쇄 할 수 있습니다.

Windows 사용 구조적 노출 처리. 악기를 사용할 수 있습니다 __try/__except, 이전 링크에 요약 된대로. 내가 쓴 특정 디버그 유틸리티에서 수행 한 방식은 기능과 관련이있었습니다. _set_se_translator (후크와 밀접하게 일치하기 때문에). Visual Studio에서는 SEH가 활성화되어 있는지 확인하십시오. 이 기능을 사용하면 시스템이 애플리케이션에서 예외를 제기 할 때 호출 할 기능을 호출 할 수 있습니다. 당신의 경우에는 그것을 부를 것입니다 EXCEPTION_ACCESS_VIOLATION. 그런 다음 예외를 던지고 처음부터 예외가 발생한 것처럼 전파 할 수 있습니다.

널 (또는 배열의 과거의 포인터 또는 무작위 무효 인 포인터)을 비교하면 정의되지 않은 동작이 발생합니다. 그것을 "잡는"휴대용 방법은 없습니다.

모든 종류의 예외 (제로, 액세스 위반 등)를 잡을 수있는 매우 쉬운 방법이 있습니다. 비주얼 스튜디오 사용 try -> catch (...) 블록.

사소한 프로젝트 조정으로 충분합니다. 만 활성화하십시오 /EHa 프로젝트 설정의 옵션. 보다 프로젝트 속성 -> C/C ++ -> 코드 생성 -> "SEH 예외가있는 예"에 대한 C ++ 예외 활성화 수정. 그게 다야!

자세한 내용을 참조하십시오.http://msdn.microsoft.com/en-us/library/1deeycx5(v=vs.80).aspx

C ++는 포인터 점검을 수행하지 않습니다 (일부 구현이 가능하다고 생각하지만). Null 포인터에 편지를 쓰려고하면 어려움을 겪을 가능성이 높습니다. 예외를 던지지 않을 것입니다. 이것을 잡으려면 글을 쓰려고하기 전에 포인터의 가치를 직접 확인해야합니다.

일반적으로 당신은 할 수 없습니다. 당신이 할 수 있더라도 누출을 뿌린 잠수함에 밴드 원조를 두려고하는 것과 같습니다.

무너진 응용 프로그램은 추락 한 것보다 훨씬 더 많은 피해를 입을 수 있습니다. 여기서 내 충고는 충돌 한 다음 왜 추락 한 이유를 고치는 것입니다. 헹구기. 반복하다.

다른 사람들이 말했듯이 C ++에서는 이것을 할 수 없습니다.

내가 더 넓은 지적을 할 수 있다면 : 당신이 그것을 잡을 수있는 언어로도 더 나은 행동은 널 포인터를 만지지 않는 것입니다. 이미 얼굴이 날아 갔을 때 오류를 잡은 다음 일어나지 않은 것처럼 계속 움직이기로 결정하는 것은 좋은 코딩 전략이 아닙니다. Null Pointer Dereference, Stack Overflow 등과 같은 것들은 언어가 다르게 반응 할 수 있더라도 치명적인 사건으로 간주되어야하며 방어 적으로 피해야합니다.

이를 수행하는 플랫폼 독립적 인 방법은 없습니다. Windows/MSVC ++에서 사용할 수 있습니다 __노력하다/__제외하고

그러나 나는 어쨌든 그것을 권장하지 않을 것입니다. 세분화 오류에서 거의 확실하게 복구 할 수 없습니다.

당신이 원한다면 당신이 자신을 확인하고 던지는 포인터를 할 수 있습니다 ...

if (p == nullptr) throw std::exception("woot! a nullptr!")
p->foo();

따라서 이것은 문제를 디버깅하는 것 뿐이며, NULLPTR은 처음에 발생하지 않아야합니다. :)

짧은 답변- 이와 같은 버그가 잠재적으로 프로세스 자체를 손상시킬 수 있기 때문에 휴대용 또는 표준 방식으로 할 수 없습니다.

긴 답변- 당신은 생각보다 더 많은 일을 할 수 있으며, 프로그램의 기본값보다 더 많은 것을 충돌시킬 수 있습니다. 그러나 3 가지를 염두에 두어야합니다.
1) 이러한 버그는 예외보다 심각하며 종종 논리에 대한 예외로 나타날 수 없습니다.
2) 공개 소비를위한 깨끗한 추상 인터페이스를 제공 할 수 있지만 검출 및 라이브러리 처리는 백엔드에 플랫폼에 따라 다릅니다.
3) 항상 너무 나빠서 끝나기 전에는 심지어 감지 할 수없는 충돌이있을 것입니다.

기본적으로, segfault 또는 힙 손상과 같은 결함은 프로그램을 실행하는 실제 프로세스를 손상시키기 때문에 예외가 아닙니다. 프로그램에 코딩 한 모든 것은 예외 처리를 포함하여 프로그램의 일부이므로 프로세스가 다가 오기 전에 멋진 오류 메시지를 기록하는 것 외에는 불가능하지 않습니다. POSIX에서 OS는 신호 시스템을 사용하여 이와 같은 결함을보고하며 콜백 함수를 등록하여 종료되기 전에 오류가 무엇인지 기록 할 수 있습니다. Windows에서 OS는 때때로 잡을 수 있고 복구 할 수있는 정상적인 예외로 변환 할 수 있습니다.

그러나 궁극적으로 가장 좋은 방법은 그러한 악몽에 대해 방어 적으로 코드하는 것입니다. 특정 OS에는 프로세스가 사라지기 전에 원칙적으로 심지어 검출 할 수 없을 정도로 나빠질 수 있습니다. 예를 들어, 자신의 스택 포인터를 손상시키는 것은 Posix 신호 콜백조차도 볼 수 없을 정도로 심하게 충돌 할 수있는 것입니다.

VC ++ 2013 (및 이전 버전)에서는 예외에 대한 브레이크 포인트를 넣을 수 있습니다.

  1. Ctrl + Alt + Delete를 누릅니다 (예외 대화 상자가 열립니다).
  2. 'win32 예외'확장
  3. "0XC0000005 액세스 위반"예외가 확인되었는지 확인하십시오.

이제 다시 디버그하면 Null Dereference가 발생했을 때 브레이크 포인트가 정확히 맞습니다.

C ++에는 널 포인터 예외가 없지만 여전히 동일하게 잡으려면 자신의 클래스 구현을 동일하게 제공해야합니다.

아래는 동일한 예입니다.

class Exception {

public:
   Exception(const string& msg,int val) : msg_(msg),e(val) {}
  ~Exception( ) {}

   string getMessage( ) const {return(msg_);}
   int what(){ return e;}
private:
   string msg_;
   int e;
};

이제 Null 포인터 점검을 기반으로 던질 수 있습니다. throw(Exception("NullPointerException",NULL));아래는 동일하게 잡기위한 코드입니다.

 catch(Exception& e) {
      cout << "Not a valid object: " << e.getMessage( )<< ": ";

        cout<<"value="<<e.what()<< endl;
   }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top