C++程序 处理异常方法

C++程序 处理异常方法

C++作为一门底层语言,经常需要处理各种异常情况,比如程序运行出错、内存溢出等。正确处理异常可以使程序更加健壮,避免程序崩溃或导致严重后果。本篇文章将介绍C++常见的异常处理方法。

try…catch语句

C++中的异常可以通过try…catch语句处理,其语法如下:

try {
    // 此处是可能会抛出异常的代码
}
catch (ExceptionType ex) {
    // 异常处理代码
}

try语句块中的代码会被执行,如果遇到异常,则会跳转到catch语句块中。catch语句块中的代码会处理异常情况,并继续执行程序。

下面是一个简单的例子,演示了try…catch语句的使用:

#include <iostream>
using namespace std;

int main() {
    int a = 10, b = 0, c;
    try {
        if (b == 0) {
            throw "除数不能为0";
        }
        c = a / b;
        cout << c << endl;
    }
    catch (const char* ex) {
        cout << "异常信息:" << ex << endl;
    }
    return 0;
}

运行上面的代码,输出结果为:

异常信息:除数不能为0

在上述代码中,我们使用了try…catch语句来处理除数为0的异常情况。当b等于0时,程序会抛出一个字符串异常,catch语句块会捕获这个异常,并输出异常信息。

常见异常类

C++标准库中提供了多种异常类,分别用于不同的异常情况。下面是一些常见的异常类:

  • std::exception:所有标准异常类的基类。
  • std::runtime_error:表示运行时错误,例如访问无效的内存地址、除数为0等。
  • std::logic_error:表示逻辑错误,例如试图打开不存在的文件。
  • std::bad_alloc:表示内存分配失败,例如使用new动态分配内存时没有足够的内存可用。

我们可以根据实际情况使用不同的异常类。

抛出异常

在C++中,我们可以使用throw关键字抛出一个异常。使用throw的语法如下:

throw ExceptionType;

其中ExceptionType是要抛出的异常类型。我们可以抛出任何类型的异常,包括字符串、整型、浮点型等。

下面是一个演示如何抛出异常的例子:

#include <iostream>
using namespace std;

int main() {
    try {
        int* p = new int[1000000000000];
    }
    catch (bad_alloc ex) {
        cout << "分配内存失败:" << ex.what() << endl;
    }

    return 0;
}

在上述代码中,我们使用了new动态分配了1000000000000个整型数组,这会导致内存分配失败,因为系统没有这么多可用内存。程序会抛出一个bad_alloc异常,catch语句块会捕获这个异常,并输出异常信息。

自定义异常类

除了使用标准异常类,我们也可以自定义异常类来处理程序中的异常情况。自定义异常类可以使程序更加易读,并能够根据程序的实际情况灵活处理异常。

下面是一个演示如何自定义异常类的例子:

#include <iostream>
#include <stdexcept>
#include <cstring>
using namespace std;

class MyException : public exception {
public:
    MyException(const char* message) : m_message(nullptr) {
        if (message != nullptr) {
            size_t size = strlen(message) + 1;
            m_message = new char[size];
            memcpy(m_message, message, size);
        }
    }
virtual ~MyException() noexcept {
        if (m_message != nullptr) {
            delete[] m_message;
        }
    }

    const char* what() const noexcept {
        return m_message;
    }

private:
    char* m_message;
};

int main() {
    try {
        throw MyException("自定义异常");
    }
    catch (MyException& ex) {
        cout << "捕获异常:" << ex.what() << endl;
    }

    return 0;
}

在上述代码中,我们定义了一个名为MyException的自定义异常类,它继承了标准异常类,并实现了虚函数what()。我们在构造函数中动态分配了内存来存储异常信息。

在main()函数中,我们使用throw关键字抛出了一个MyException类型的异常,catch语句块会捕获这个异常,并输出异常信息。

条件编译调试信息

在编写C++程序时,我们常常需要输出调试信息来帮助我们调试程序,但是这些调试信息在程序正式发布时不需要输出。这时我们可以使用条件编译来控制调试信息的输出。

下面是一个演示如何使用条件编译控制调试信息输出的例子:

#include <iostream>
#define DEBUG

int main() {
#ifndef DEBUG
    std::cout << "调试信息:" << "这是调试信息" << std::endl;
#endif

    std::cout << "程序正式发布" << std::endl;

    return 0;
}

在上述代码中,我们使用了宏定义DEBUG来表示是否需要输出调试信息。如果需要输出调试信息,就将宏定义为1;如果不需要输出调试信息,就将宏定义为0。

在main()函数中,我们使用了#ifndef和#endif来包裹需要进行条件编译的代码。如果DEBUG宏没有定义,则会输出调试信息;如果DEBUG宏定义了,则不会输出调试信息。

结论

C++中可以使用try…catch语句来处理程序异常情况,也可以使用多种标准异常类来向外部抛出异常。我们也可以根据实际需求,自定义异常类来更好地灵活处理异常。此外,我们还可以通过条件编译来控制调试信息的输出。通过灵活运用这些知识,我们能够更加有效地保证程序的稳定性和健壮性。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

C++ 示例