> 백엔드 개발 > C++ > 본문

내 코드에서 처리되지 않은 예외의 원인을 정확히 찾아내려면 어떻게 해야 합니까?

Patricia Arquette
풀어 주다: 2024-11-16 15:33:03
원래의
340명이 탐색했습니다.

How can I pinpoint the source of unhandled exceptions in my code?

처리되지 않은 예외의 소스 식별

예외 처리 영역에서는 예외의 근본 원인을 찾아내는 능력이 무엇보다 중요합니다. 예외를 생성할 때 추가 정보를 포함하는 것은 매우 간단하지만 처리되지 않은 예외 또는 외부 예외가 발생하는 정확한 코드 줄을 결정하는 것은 어려울 수 있습니다.

구조를 위한 사용자 정의 클래스 및 매크로

효과적인 해결책 중 하나는 사용자 정의 예외 클래스와 매크로를 활용하는 것입니다. 표준 std::runtime_error를 확장하는 사용자 정의 예외 클래스 my_Exception을 정의할 수 있습니다. 이 클래스 내에서 예외의 파일 이름, 줄 번호 및 원래 오류 메시지를 사용하여 메시지를 초기화합니다.

다음으로 인수를 취하고 적절한 my_Exception을 발생시키는 throw_line() 매크로를 만듭니다. 정보. 이 매크로는 자세한 오류 컨텍스트를 포함하는 예외 발생 프로세스를 단순화합니다.

데모:

다음 예제 코드를 고려해 보겠습니다.

#include <iostream>
#include <sstream>
#include <stdexcept>
#include <string>

class my_exception : public std::runtime_error {
    std::string msg;
public:
    my_exception(const std::string &arg, const char *file, int line) :
    std::runtime_error(arg) {
        std::ostringstream o;
        o << file << ":" << line << ": " << arg;
        msg = o.str();
    }
    ~my_exception() throw() {}
    const char *what() const throw() {
        return msg.c_str();
    }
};
#define throw_line(arg) throw my_exception(arg, __FILE__, __LINE__);

void f() {
    throw_line("Oh no!");
}

int main() {
    try {
        f();
    }
    catch (const std::runtime_error &ex) {
        std::cout << ex.what() << std::endl;
    }
}
로그인 후 복사

이 코드를 실행하면 출력은 다음과 같습니다.

myFile.cpp:20: Oh no!
로그인 후 복사

보시다시피 정확한 파일 이름, 줄 번호 및 예외 인수가 포함된 자세한 오류 메시지를 제공합니다. 이 정보는 디버깅을 크게 단순화하고 효율적인 근본 원인 분석을 가능하게 합니다.

위 내용은 내 코드에서 처리되지 않은 예외의 원인을 정확히 찾아내려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿