프로그램을 실행할 때마다 예외가 발생하고 정확히 무엇이 던져 졌는지 확인하는 방법을 모릅니다. 따라서 제 질문은 예외를 catch하는 것이고 이 사전에 감사 (나는 예외가 발생 행을 찾을 수 없음) 인쇄알 수없는 예외를 잡아 내고 인쇄하는 방법
27
A
답변
32
이 std::exception
에서 파생 경우 참조로 잡을 수 :
try
{
// code that could cause exception
}
catch (const std::exception &exc)
{
// catch anything thrown within try block that derives from std::exception
std::cerr << exc.what();
}
그러나
예외가std::exception
에서 파생되지 않는 한 어떤 클래스 인 경우, 당신은 미리 유형을 알고 있어야합니다 (즉,
std::string
또는을 잡아야합니다).).
당신은 캐치 모두 수행 할 수 있습니다
try
{
}
catch (...)
{
}
을하지만 당신은 제외하고 아무것도 할 수 없습니다.
1
먼저 R Samuel Klatchko의 제안대로 시도해보십시오. 도움이되지 않으면 다른 도움이 될 수 있습니다.
a) 디버거가 지원하는 경우 예외 유형 (처리됨 또는 처리되지 않음)에 중단 점을 배치하십시오.
b) 일부 시스템에서 컴파일러는 throw 문이 실행될 때 (문서화되지 않은?) 함수에 대한 호출을 생성합니다. 시스템에 어떤 기능이 있는지 알아 내려면 예외를 던지고 잡는 간단한 hello world 프로그램을 작성하십시오. 디버거를 시작하고 예외 생성자에 중단 점을 배치하고 호출되는 곳을 참조하십시오. caling 함수는 아마도 __throw()와 비슷할 것입니다. 그 후에 디버거로 조사하려는 프로그램으로 디버거를 다시 시작하십시오. 위에서 언급 한 함수 (__throw 또는 무엇이든)에 중단 점을 배치하고 프로그램을 실행합니다. 예외가 발생하면 디버거가 멈추고 바로 찾을 수 있습니다.
3
gcc 또는 CLANG에 ABI를 사용하면 알 수없는 예외 유형을 알 수 있습니다. 그러나 그것은 비표준 솔루션입니다.
11
C++ 11에서 참조하십시오, 당신은 : 사이트에서 std::current_exception
예제 코드 :
이 헤더를 포함 : DAWID 할 Drozd 응답에서 영감을
#include <iostream>
#include <string>
#include <exception>
#include <stdexcept>
void handle_eptr(std::exception_ptr eptr) // passing by value is ok
{
try {
if (eptr) {
std::rethrow_exception(eptr);
}
} catch(const std::exception& e) {
std::cout << "Caught exception \"" << e.what() << "\"\n";
}
}
int main()
{
std::exception_ptr eptr;
try {
std::string().at(1); // this generates an std::out_of_range
} catch(...) {
eptr = std::current_exception(); // capture
}
handle_eptr(eptr);
} // destructor for std::out_of_range called here, when the eptr is destructed
0
을 #include <exception>
try
{
// The code that could throw
}
catch(...)
{
auto expPtr = std::current_exception();
try
{
if(expPtr) std::rethrow_exception(expPtr);
}
catch(const std::exception& e) //it would not work if you pass by value
{
std::cout << e.what();
}
}
관련 문제
- 1. 예외를 잡아 내고 펄 스크립트가 계속 실행되게하는 방법?
- 2. 파이썬에서 예외를 잡아 내고 형식을 알지 못하고 예외에 대한 참조를 얻는 방법?
- 3. TEdit 컨트롤에서 VK_TAB 키를 잡아 내고 포커스를 잃지 않게하려면 어떻게합니까?
- 4. Fabric에서 auth errors를 잡아 내고 다시 시도하는 방법은 무엇입니까?
- 5. 알 수없는 컬렉션의 값을 반복 및 인쇄하는 일반적인 방법이 있습니까?
- 6. 알 수없는 창 닫기 방법
- 7. java.util.zip.zipexception : 알 수없는 압축 방법
- 8. "알 수없는 서버 오류"를 디버깅하는 방법?
- 9. 알 수없는 유형의 CreateDelegate
- 10. 파이썬 예외를 인쇄하는 적절한 방법은 무엇입니까?
- 11. 알 수없는 너비의 블록 요소에 알 수없는 너비의 블록 요소를 알 수없는 너비의 중심에 배치하려면 어떻게합니까?
- 12. 원인을 알 수없는 경우 문제를 디버그하는 방법
- 13. 알 수없는 동적 속성을 설정하는 방법
- 14. 오라클에서 알 수없는 열을 가져 오는 방법
- 15. indy에서 알 수없는 클라이언트를 차단하는 방법 (Delphi)
- 16. 알 수없는 오류 : MySQLTransactionRollbackException 1213
- 17. 알 수없는 URL 콘텐츠 : 알 수없는 URL 콘텐츠 : \ com.mohit.provider.FormulaProvider \ 수식
- 18. 파이썬에서 방금 제기 한 예외를 잡는 방법?
- 19. 알 수없는 데이터 액세스
- 20. 알 수없는 참조 dlopen을
- 21. 알 수없는 개체 만들기
- 22. MySQL의 '알 수없는 열'오류
- 23. 알 수없는 수정 'L'오류
- 24. 알 수없는 이벤트 바인딩
- 25. 알 수없는 특성 동안
- 26. 알 수없는 성능 문제
- 27. DDB 알 수없는 파일
- 28. 콤보 선택은 알 수없는
- 29. 알 수없는 명령 dumpdata
- 30. Java 알 수없는 출력
@R Samuel Klatchko : 감사합니다. 한 가지 더 질문합니다. 새 메소드와 삭제 메소드를 사용할 수 있습니까? – helloWorld
@helloWorld - 그렇습니다.이 메소드는'new','delete' 그리고'new' 나'delete' 문이'try' 블록 안에 있다는 조건으로 호출되는 생성자 나 소멸자에서 던져진 예외를 잡아낼 것입니다. –
std :: exception에서 예외가 파생되지 않은 경우 내 문제를 어떻게 해결해야합니까? – javapowered