>  기사  >  백엔드 개발  >  C에서 처리되지 않은 예외의 정확한 소스를 어떻게 식별할 수 있습니까?

C에서 처리되지 않은 예외의 정확한 소스를 어떻게 식별할 수 있습니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-18 12:18:02749검색

How Can I Identify the Exact Source of Unhandled Exceptions in C  ?

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

프로그래밍에서는 예외 상황이 자주 발생하여 정상적인 실행 흐름을 방해하는 예외가 발생합니다. 일반적으로 의도적으로 생성한 예외의 원인을 찾아내는 것은 간단하지만, 처리되지 않은 예외나 외부 시스템에서 생성된 예외의 원인을 추적하는 것은 어려울 수 있습니다.

한 가지 접근 방식은 예외에 내장된 정보에 의존하는 것입니다. 여기에는 오류를 담당하는 행 및 소스 파일에 대한 포인터가 포함될 수 있습니다. 그러나 이 정보는 모든 시나리오에서 항상 사용 가능하거나 신뢰할 수 있는 것은 아닙니다.

이 제한 사항을 해결하려면 원래 예외와 소스 정보를 모두 캡슐화하는 사용자 정의 예외 클래스를 활용하는 것이 좋습니다. 이를 통해 포괄적이고 사용자 친화적인 방식으로 예외를 처리하고 해당 출처에 대한 정확한 세부 정보를 제공할 수 있습니다.

이러한 사용자 정의 예외 클래스를 구현하는 방법은 다음과 같습니다.

#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!");
}

다음을 사용하여 예외가 트리거될 때 이 매크로를 사용하면 my_Exception 클래스는 파일 이름과 줄 번호를 포함한 소스 정보를 자동으로 저장합니다.

이제 이 사용자 정의 클래스를 사용하여 예외를 처리하는 방법을 살펴보겠습니다.

int main() {
    try {
        f();
    }
    catch (const std::runtime_error &ex) {
        std::cout << ex.what() << std::endl;
    }
}

By 사용자 정의 예외 클래스의 what() 함수를 활용하면, 발생 소스 정보가 포함된 자세한 오류 메시지를 얻을 수 있어 정확한 오류 진단 및 해결이 가능합니다.

위 내용은 C에서 처리되지 않은 예외의 정확한 소스를 어떻게 식별할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.