第二十一课:异常处理
学习目标:
- 理解异常和异常处理的概念。
- 学习如何使用
try
、catch
和throw
来处理程序中的错误。 - 掌握如何创建自定义异常。
- 学习异常处理中的“资源获取即初始化”(RAII)原则。
学习内容:
-
异常处理的概念:
异常是程序运行期间发生的一种特殊情况,通常是因为错误或者其他不寻常的条件。异常处理是一种编程范式,用于管理程序执行期间发生的异常情况。 -
基本异常处理:
使用try
、catch
和throw
关键字可以捕获并处理异常。代码示例:
#include <iostream> using namespace std; int divide(int numerator, int denominator) { if (denominator == 0) { throw "Division by zero condition!"; } return numerator / denominator; } int main() { try { int result = divide(10, 0); cout << result << endl; } catch (const char* e) { cout << "Caught an exception: " << e << endl; } return 0; }
预计输出效果:
Caught an exception: Division by zero condition!
-
自定义异常:
可以通过继承std::exception
类来创建自定义异常。代码示例:
#include <iostream> #include <exception> using namespace std; class MyException : public exception { public: const char * what() const throw() { return "Custom Exception!"; } }; int main() { try { throw MyException(); } catch (MyException& e) { cout << "Caught an exception: " << e.what() << endl; } return 0; }
预计输出效果:
Caught an exception: Custom Exception!
-
异常处理的使用场景:
在文件操作、网络通信、内存管理等可能出现错误的场景中,使用异常处理可以使程序更加健壮,易于调试和维护。
练习题:
编写一个简单的计算器程序,它可以执行加法、减法、乘法和除法。对于除法,当尝试除以零时,程序应该抛出一个异常,并且应该有一个捕获该异常的块,并向用户显示一条错误消息。
答案:
#include <iostream>
using namespace std;
class DivideByZeroException : public exception {
public:
const char* what() const throw() {
return "Attempted to divide by zero!";
}
};
double calculate(double a, double b, char op) {
switch (op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/':
if (b == 0) throw DivideByZeroException();
return a / b;
default:
throw "Unsupported operation!";
}
}
int main() {
double num1, num2;
char operation;
cout << "Enter two numbers and an operation (+, -, *, /): ";
cin >> num1 >> num2 >> operation;
try {
double result = calculate(num1, num2, operation);
cout << "Result: " << result << endl;
} catch (const DivideByZeroException& e) {
cout << "Caught an exception: " << e.what() << endl;
} catch (const char* msg) {
cout << "Caught an exception: " << msg << endl;
}
return 0;
}
预计输出效果(示例):
Enter two numbers and an operation (+, -, *, /): 10 0 /
Caught an exception: Attempted to divide by zero!
在这个练习中,学生们将学会如何处理程序中可能出现的错误情况,如何使用异常来通知错误,并且如何编写代码来处理这些异常。这是编写健壮和可靠程序的重要一步。