Cpp异常处理

在C++中,处理潜在异常通常有几种方法,包括使用异常处理机制、增加错误检查和日志记录、以及编写健壮的代码。以下是一些常见的策略来防止程序因某个方法错误而崩溃:

1. 使用异常处理

C++ 提供了 trycatchthrow 机制来处理异常。你可以捕获异常并进行适当的处理,而不是让程序直接崩溃。

#include <iostream>
#include <stdexcept>

void someFunction() {
    // 假设这里可能会抛出一个异常
    if (/* 某种条件 */) {
        throw std::runtime_error("发生了一个运行时错误");
    }
}

int main() {
    try {
        someFunction();
    } catch (const std::exception& e) {
        std::cerr << "捕获到异常: " << e.what() << std::endl;
        // 在这里可以进行错误恢复或清理操作
    } catch (...) {
        std::cerr << "捕获到未知类型的异常" << std::endl;
    }

    // 继续执行其他代码
    return 0;
}

2. 增加错误检查

在函数调用前后增加错误检查,确保输入数据有效,并在发现错误时采取适当的措施。

bool isDurationValid(const QString& duration) {
    QStringList parts = duration.split(':');
    if (parts.size() != 2) {
        qWarning() << "无效的时长格式:" << duration;
        return false;
    }

    bool ok;
    int minutes = parts[0].toInt(&ok);
    if (!ok) {
        qWarning() << "无效的分钟值:" << parts[0];
        return false;
    }

    int seconds = parts[1].toInt(&ok);
    if (!ok) {
        qWarning() << "无效的秒数值:" << parts[1];
        return false;
    }

    if (minutes < 0 || seconds < 0 || seconds >= 60) {
        qWarning() << "无效的时间值:" << duration;
        return false;
    }

    return true;
}

int durationToSeconds(const QString& duration) {
    if (!isDurationValid(duration)) {
        return 0;  // 返回默认值
    }

    QStringList parts = duration.split(':');
    int minutes = parts[0].toInt();
    int seconds = parts[1].toInt();

    return minutes * 60 + seconds;
}

3. 日志记录

使用日志记录库(如 qDebugqWarningqCritical 等)来记录错误信息,以便于调试和故障排除。

#include <QLoggingCategory>

Q_LOGGING_CATEGORY(myLog, "my.log")

void someFunction() {
    if (/* 某种条件 */) {
        qCCritical(myLog) << "发生了一个严重的错误";
        // 可以在这里抛出异常或返回错误码
    }
}

4. 编写健壮的代码

确保你的代码能够处理各种边界情况和异常情况。例如,在处理文件操作时,确保文件打开成功;在网络请求时,处理网络连接失败的情况等。

#include <fstream>

void readFile(const std::string& filename) {
    std::ifstream file(filename);
    if (!file.is_open()) {
        qCritical() << "无法打开文件:" << filename;
        return;
    }

    // 读取文件内容
    // ...

    file.close();
}

5. 使用智能指针和 RAII

利用 C++ 的 RAII(Resource Acquisition Is Initialization)机制,确保资源在对象生命周期结束时被正确释放。使用智能指针(如 std::unique_ptrstd::shared_ptr)来管理动态分配的内存。

#include <memory>

class Resource {
public:
    Resource() {
        // 初始化资源
    }
    ~Resource() {
        // 释放资源
    }
};

void useResource() {
    std::unique_ptr<Resource> resource(new Resource());
    // 使用资源
    // ...
    // 资源会在作用域结束时自动释放
}

6. 静态分析工具

使用静态分析工具(如 Clang-Tidy、Coverity 等)来检测潜在的错误和不安全的代码。

最后修改于:2025年01月22日 09:40

添加新评论