>  기사  >  백엔드 개발  >  C++ 예외 처리 방법

C++ 예외 처리 방법

angryTom
angryTom원래의
2019-10-23 11:51:564829검색

C++ 예외 처리 방법

c++ 예외 처리

프로그램이 실행될 때 종종 비정상적인 상황이 발생합니다. 예를 들어, 나누기를 할 때 사용자가 나이를 입력할 때 음수를 입력하면 제수는 0입니다. 공간을 동적으로 할당하는 새 연산자, 공간이 부족하여 공간을 할당할 수 없습니다. 배열 요소에 액세스할 때 아래 첨자가 범위를 벗어났습니다. 파일을 읽을 때 파일이 존재하지 않습니다.

이러한 비정상적인 상황을 발견하고 처리하지 않으면 프로그램이 중단될 수 있습니다.

소위 "처리"는 오류 메시지를 표시한 다음 오류를 일으키지 않는 경로를 따라 프로그램이 계속 실행되도록 하는 것을 의미할 수 있습니다. 또한 프로그램을 종료해야 하지만 종료하기 전에 필요한 작업을 수행하는 것을 의미할 수도 있습니다. 프로그램을 메모리에 복사하는 것과 같이 파일에 데이터를 쓰고, 열린 파일을 닫고, 동적으로 할당된 메모리 공간을 해제하는 등의 작업을 수행합니다.

C++에는 예외 처리 메커니즘이 도입되었습니다. 기본 아이디어는 함수 A가 실행 중에 예외를 발견하면 이를 처리할 수 없고 함수 B로 간주되는 A 호출자에게 "예외를 발생시킵니다"라는 것입니다.

예외를 처리하지 않고 발생시키면 함수 A가 즉시 종료됩니다. 이 경우 함수 B는 A에서 발생한 예외를 포착하여 처리하거나 무시하도록 선택할 수 있습니다. 무시하면 B 호출자에게 예외가 발생합니다.

각 수준의 함수가 예외를 처리하지 않으면 예외는 결국 가장 바깥쪽의 기본 함수에 발생하게 됩니다. 기본 함수는 예외를 처리해야 합니다. 주 함수가 예외를 처리하지 않으면 프로그램이 즉시 비정상적으로 종료됩니다.

C++ 예외 처리를 위한 기본 구문

C++에서는 throw 문과 try...catch 문을 통해 예외 처리를 구현합니다. throw 문의 구문은 다음과 같습니다.

throw  表达式;

이 문은 예외를 발생시킵니다. 예외는 값 유형이 기본 유형 또는 클래스일 수 있는 표현식입니다.

try...catch 语句的语法如下:
try {
    语句组
}catch(异常类型) {
  异常处理代码
}...catch(异常类型) {
    异常处理代码
}

catch는 여러 개를 가질 수 있지만 적어도 하나는 있어야 합니다.

try와 다음 {}의 콘텐츠를 "try 블록"으로 호출하고, catch와 다음 {}의 콘텐츠를 "catch 블록"으로 호출할 수도 있습니다.

try..의 실행 프로세스 .catch 문은 다음과 같습니다. 실행 try 블록의 문을 실행하는 동안 예외가 발생하지 않으면 마지막 catch 블록 뒤의 문이 실행 후에 실행되고, 다음과 같은 경우 catch 블록의 모든 문이 실행되지 않습니다. try 블록 실행 중에 예외가 발생합니다. 예외가 발생하면 예외가 발생한 후 "예외 유형"이 실행을 위해 던져진 예외 유형과 일치하는 첫 번째 catch 블록으로 즉시 점프합니다(예외는 다음과 같다고 합니다). catch 블록에 의해 "잡히고" 실행 후 점프하여 마지막 catch 블록으로 이동하여 실행을 계속합니다.

예를 들어 다음 프로그램은

#include <iostream>
using namespace std;
int main()
{
    double m ,n;
    cin >> m >> n;
    try {
        cout << "before dividing." << endl;
        if( n == 0)
            throw -1; //抛出int类型异常
        else
            cout << m / n << endl;
        cout << "after dividing." << endl;
    }
    catch(double d) {
        cout << "catch(double) " << d <<  endl;
    }
    catch(int e) {
        cout << "catch(int) " << e << endl;
    }
    cout << "finished" << endl;
    return 0;
}

프로그램의 실행 결과는 다음과 같습니다.

9 6↙
before dividing.
1.5
after dividing.
finished

설명: n이 0이 아닌 경우 try 블록에서 예외가 발생하지 않습니다. 따라서 try 블록이 정상적으로 실행된 후 프로그램은 모든 catch 블록을 넘어 계속 실행되며 어떤 catch 블록도 실행되지 않습니다.

프로그램 실행 결과는 다음과 같을 수도 있습니다.

9 0↙
before dividing.
catch\(int) -1
finished

n이 0이면 try 블록에서 정수 예외가 발생합니다. 예외가 발생하면 try 블록의 실행이 즉시 중지됩니다. 정수 예외는 일치하는 유형의 첫 번째 catch 블록에 의해 포착됩니다. 즉, 실행을 위해 catch(int e) 블록에 들어갑니다. catch 블록이 실행된 후 프로그램은 정상적으로 종료될 때까지 계속 실행됩니다.

발생된 예외가 catch 블록에서 포착되지 않는 경우(예: catch(int e)를 catch(char e)로 변경하고 입력 n이 0일 때 발생된 정수 예외를 catch 블록에서 포착할 수 없습니다. 예외가 처리되지 않으면 프로그램이 즉시 종료되고 try...catch 이후의 내용이 실행되지 않습니다.

위 내용은 C++ 예외 처리 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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