최고의 C ++ 예외 처리 튜토리얼 2024년, 이 튜토리얼에서는 예외를 던져,예외를 잡아라,C ++ 표준 예외,새로운 예외를 정의,를 배울 수 있습니다.
예외가 발생하는 절차를 실행하는 동안 문제가된다. C ++ 예외는 특별한 프로그램은 제로 조작에 의해 분할하는 시도로, 실행되는 경우 발생을 의미한다.
예외는 프로그램 전송 제어 방법을 제공한다. 던져, 캐치를 시도: C ++ 예외 처리는 세 가지 키워드를포함한다.
블록 예외를 throw가있는 경우를 제외하고 방법을시도하고 캐치키워드를 사용 잡을 수있어. 블록 코드가 코드 보호로 알려져있다 시도 예외를 던질 수있는 코드의 블록을 배치하려고합니다. 다음과 같이 사용 시도 / catch 문 구문은 다음과 같습니다
try { // 保护代码 }catch( ExceptionName e1 ) { // catch 块 }catch( ExceptionName e2 ) { // catch 块 }catch( ExceptionName eN ) { // catch 块 }
다른 예외가 발생합니다 다른 상황에서 블록을시도 할 경우,이 시간은 예외의 다른 유형을 잡기 위해 여러 catch문을 나열 시도 할 수 있습니다.
코드 블록에 예외를 throw에 당신은 어디서나throw 문을 사용할 수 있습니다.피연산자를 던져 문 식의 결과 어떤 식 타입 발생한 예외의 종류를 판단 할 수있다.
예외가 예제로 나눈 제로를 시도입니다 :
double division(int a, int b) { if( b == 0 ) { throw "Division by zero condition!"; } return (a/b); }
try 블록 뒤에 catch블록은 예외를 촬영합니다. 당신은 캐치 키워드 결정 후 괄호 안에 예외로 선언 캡처 할 예외의 유형을 지정할 수 있습니다.
try { // 保护代码 }catch( ExceptionName e ) { // 处理 ExceptionName 异常的代码 }
위의 코드는 타입ExceptionName 예외를 캡처합니다.당신은 예외 발생 try 블록의 모든 유형을 처리하기 위해 블록을 잡을하려면 다음과 같이 괄호 ko. 생략에 명시된 예외를 사용해야합니다 :
try { // 保护代码 }catch(ko.) { // 能处理任何异常的代码 }
여기에 0으로 나눗셈의 예에서 예외가 발생하고, 예외가 catch 블록에 걸렸습니다.
#include <iostream> using namespace std; double division(int a, int b) { if( b == 0 ) { throw "Division by zero condition!"; } return (a/b); } int main () { int x = 50; int y = 0; double z = 0; try { z = division(x, y); cout << z << endl; }catch (const char* msg) { cerr << msg << endl; } return 0; }
우리는 그러므로, 타입const를 숯불 * 예외가 발생하기 때문에, 때 캐치 그 예외, 우리는 catch 블록에서 const를 숯불 *를 사용해야합니다.상기 코드는 컴파일되고 실행될 때, 다음과 같은 결과를
Division by zero condition!
C ++은<예외>에 정의 된 표준 예외,우리는 프로그램에서 이러한 표준 예외를 사용할 수있는 세트를 제공합니다. 다음과 같이 그들은 조직 부모 - 자식 클래스 계층을 기반으로합니다 :
위의 표는 각 계층의 설명에 이상이 나타날 수 있습니다 :
异常 | 描述 |
---|---|
std::exception | 该异常是所有标准 C++ 异常的父类。 |
std::bad_alloc | 该异常可以通过new抛出。 |
std::bad_cast | 该异常可以通过dynamic_cast抛出。 |
std::bad_exception | 这在处理 C++ 程序中无法预期的异常时非常有用。 |
std::bad_typeid | 该异常可以通过typeid抛出。 |
std::logic_error | 理论上可以通过读取代码来检测到的异常。 |
std::domain_error | 当使用了一个无效的数学域时,会抛出该异常。 |
std::invalid_argument | 当使用了无效的参数时,会抛出该异常。 |
std::length_error | 当创建了太长的 std::string 时,会抛出该异常。 |
std::out_of_range | 该异常可以通过方法抛出,例如 std::vector 和 std::bitset<>::operator[]()。 |
std::runtime_error | 理论上不可以通过读取代码来检测到的异常。 |
std::overflow_error | 当发生数学上溢时,会抛出该异常。 |
std::range_error | 当尝试存储超出范围的值时,会抛出该异常。 |
std::underflow_error | 当发生数学下溢时,会抛出该异常。 |
당신은예외 클래스 상속과 오버로드에 의해 새로운 예외를 정의 할 수 있습니다.다음의 예에서는, 자신의 예외를 구현하는 표준 : : 예외 클래스를 사용하는 방법을 보여줍니다 :
#include <iostream> #include <exception> using namespace std; struct MyException : public exception { const char * what () const throw () { return "C++ Exception"; } }; int main() { try { throw MyException(); } catch(MyException& e) { std::cout << "MyException caught" << std::endl; std::cout << e.what() << std::endl; } catch(std::exception& e) { //其他的错误 } }
이것은 다음과 같은 결과를
MyException caught C++ Exception
여기, 무엇을 () 메소드는 모든 하위 예외 클래스를 오버로드 된 것을 제공하는 공공 예외 클래스입니다.이렇게 생성 된이 예외의 원인을 반환합니다.