温馨提示×

ubuntu c++怎么处理异常

小樊
39
2026-09-17 13:38:56
栏目: 编程语言

Ubuntu(Linux)下使用 C++ 处理异常,本质上使用的是 C++ 标准异常机制(try / catch / throw),和 Windows 没有本质区别,只是编译、运行环境不同。下面从基础用法 → 编译方法 → 常见实践 → Ubuntu 特有注意点给你讲清楚。


一、C++ 异常处理基础(标准写法)

1️⃣ 基本语法

#include <iostream>
#include <exception>

using namespace std;

int main() {
    try {
        throw runtime_error("发生错误");
    } catch (const exception& e) {
        cerr << "捕获异常: " << e.what() << endl;
    }
    return 0;
}

2️⃣ 常见异常类型(<stdexcept>

#include <stdexcept>
类型 说明
runtime_error 运行时错误
logic_error 逻辑错误
out_of_range 越界
invalid_argument 参数非法
ios_base::failure IO 错误

示例:

throw out_of_range("index too big");

3️⃣ 自定义异常

class MyException : public exception {
public:
    const char* what() const noexcept override {
        return "My custom exception";
    }
};

使用:

throw MyException();

二、在 Ubuntu 上编译运行

1️⃣ 使用 g++ 编译

g++ main.cpp -o main
./main

✅ C++ 异常 默认开启,不需要额外参数


2️⃣ 开启 C++11 / C++17(推荐)

g++ -std=c++17 main.cpp -o main

三、Ubuntu 下常见异常场景

1️⃣ 段错误(SIGSEGV)≠ C++ 异常

int* p = nullptr;
*p = 10;   // ❌ 段错误,不会进入 catch

✅ 段错误是 操作系统信号,不是 C++ 异常
✅ 无法通过 try/catch 捕获

可以处理信号(进阶):

#include <signal.h>
void handler(int) { exit(1); }
signal(SIGSEGV, handler);

2️⃣ 系统调用失败(如 open / fork)

系统调用一般返回 -1,用 errno

#include <cerrno>
#include <cstring>

if (open("file", O_RDONLY) == -1) {
    throw runtime_error(strerror(errno));
}

3️⃣ 多线程异常

❗ 子线程异常不会传播到主线程

void thread_func() {
    throw runtime_error("thread error"); // 直接 terminate
}

✅ 正确做法:

try {
    thread_func();
} catch (...) {
    // 捕获后传回主线程
}

四、异常安全(重要)

RAII(强烈推荐)

class File {
public:
    File(const char* name) { f = fopen(name, "r"); }
    ~File() { if (f) fclose(f); }
private:
    FILE* f;
};

✅ 即使抛出异常,资源也会释放


五、Ubuntu / Linux 特有注意点

1️⃣ 不要忽略异常

catch (...) { }  // ❌ 危险

2️⃣ 查看异常导致的中止

ulimit -c unlimited
./main

生成 core 文件,用 gdb 分析


3️⃣ 编译期关闭异常(不推荐)

g++ -fno-exceptions main.cpp

❌ 会导致 throw 直接调用 terminate


六、推荐学习路径

✅ 掌握顺序:

  1. try / catch / throw
  2. std::exception
  3. RAII
  4. 多线程异常
  5. 信号 vs 异常

如果你愿意,可以告诉我:

  • 你是 初学者 / 进阶
  • 是否使用 多线程 / 网络 / 系统编程
  • Ubuntu 版本(20.04 / 22.04)

我可以给你更针对性的示例。

0