C语言异常处理全攻略:轻松搞定程序中的意外情况


1. 了解异常类型

- 全局异常:这是最基础的异常类型,当程序执行到无法继续的地方时抛出。

- 局部异常:通常由函数调用者抛出,用于报告函数内部的错误。

- 运行时异常:由编译器或操作系统抛出,例如除以零错误。

2. 使用`try`/`catch`块

- `try`块包含可能引发异常的代码。

- `catch`块捕获并处理异常。

- `finally`块确保无论是否发生异常,都会执行某些清理操作。

c

include

int main() {

try {

// 可能会抛出异常的代码

int a = 5;

int b = 0;

if (b == 0) {

throw "Divide by zero";

}

int result = a / b;

printf("Result: %d", result);

} catch (const char msg) {

printf("Caught exception: %s", msg);

} finally {

printf("Finally block executed");

}

return 0;

}

3. 捕获特定类型的异常

- 使用`catch (...)`来捕获所有类型的异常。

- 使用`catch (ExceptionType)`来捕获特定类型的异常。

4. 自定义异常类

- 创建自定义异常类,继承自`stdexcept`或`std::exception`。

- 在`catch`块中实例化这个异常类,并使用其构造函数。

c

include

class MyException : public std::runtime_error {

public:

MyException(const char message) : std::runtime_error(message) {}

};

void myFunction() {

if (condition) {

throw MyException("An error occurred");

}

}

int main() {

try {

myFunction();

} catch (MyException& e) {

// 处理自定义异常

printf("Caught custom exception: %s", e.what());

} catch (const std::exception& e) {

// 处理标准异常

printf("Caught standard exception: %s", e.what());

} catch (...) {

// 处理其他未知异常

printf("Caught unknown exception");

}

return 0;

}

5. 避免资源泄漏

- 在`finally`块中释放动态分配的资源,如内存、文件句柄等。

- 使用智能指针管理资源,确保它们在使用后被正确释放。

6. 测试和调试

- 使用断点、单步执行等工具进行调试。

- 编写单元测试,确保异常处理逻辑的正确性。

通过遵循上述策略,你可以有效地处理C语言中的异常,确保程序的稳定性和可靠性。