C++程序 显示运行时异常
在C++中,程序运行时可能会遭遇异常,例如除以零、数组越界、空指针引用等等。我们知道,异常的发生会导致程序运行中断,造成不良的影响。因此,本篇文章将针对C++程序运行时异常展开讨论,帮助大家了解一些常见的异常及其处理方式。
常见的异常类型
除以零
当我们在程序中执行除法运算时,如果被除数为0,就会导致除以零的异常发生。以下是一个计算1/n的程序示例:
#include<iostream>
using namespace std;
int main(){
int n;
cin >> n;
double result = 1.0/n;
cout << "1/" << n << " = " << result << endl;
return 0;
}
当我们输入0时,该程序会抛出如下异常信息:
terminate called after throwing an instance of 'std::system_error'
what(): Operation not permitted
Aborted (core dumped)
数组越界
数组越界就是指我们在访问数组元素时,超出了数组的合法下标范围。以下是一个数组越界的程序示例:
#include<iostream>
using namespace std;
int main(){
int a[3] = {1,2,3};
for(int i=0;i<5;i++){
cout << a[i] << " ";
}
return 0;
}
运行以上代码会出现如下异常信息:
Segmentation fault (core dumped)
空指针引用
空指针引用就是指我们在使用未初始化或已被释放的指针时,对指针进行访问操作。以下是一个空指针引用的程序示例:
#include<iostream>
using namespace std;
int main(){
int* p = NULL;
*p = 10;
cout << *p << endl;
return 0;
}
运行以上代码会出现如下异常信息:
Segmentation fault (core dumped)
异常处理
C++程序提供了异常处理机制,能够帮助我们在程序异常发生时,进行异常的捕获、处理及清理工作。以下是一个try-catch语句的示例:
#include<iostream>
using namespace std;
int main(){
try{
int a,b;
cin >> a >> b;
if(b == 0){
throw "Division by zero"; // 抛出异常
}
double result = 1.0*a/b;
cout << a << "/" << b << " = " << result << endl;
}catch(const char* msg){ // 捕获并处理异常
cout << "Error: " << msg << endl;
return -1;
}
return 0;
}
在上述示例中,我们使用了throw
语句抛出了一个字符串类型的异常,并使用catch
语句捕获了该异常,并对其进行处理。例如,在运行该程序时输入0,则会得到如下的异常处理结果:
Error: Division by zero
值得注意的是,C++提供了多种异常处理方式,例如使用try-catch
语句、throw
语句、try-catch-finally
等语句,读者可以根据自己的需求选择不同的方式。
异常安全
在编写程序时,我们不仅需要考虑异常的处理,还需要考虑异常发生时对程序是否正确、完整性的影响,即需要考虑异常安全。以下是一些关于异常安全的建议:
- 避免使用裸指针,使用智能指针代替。
- 避免手动内存管理,使用RAII技术代替。
- 避免泄漏异常,即当异常发生时保证资源能被正常释放,避免产生资源泄漏。
- 避免修改全局变量和静态变量,让程序的状态尽可能不修改。
异常与性能
由于异常处理会对程序产生一些额外的开销,有时候我们需要权衡使用异常处理的成本。以下是一些关于异常与性能的建议:
- 异常处理通常比条件判断要慢。所以在某些情况下,可以通过条件判断来代替异常处理,以提高程序的性能。
- 合理使用异常处理,适时处理异常,并不滥用于程序中的各个细节,可以提高程序的性能。
结论
程序运行时可能会遭遇各种异常,例如除以零、数组越界、空指针引用等等,这些异常会导致程序中断。为了帮助我们处理异常,C++提供了异常处理机制,可以帮助程序员在程序异常发生时,进行异常的捕获、处理及清理工作。除了异常处理,程序员还需要考虑程序的异常安全和程序性能等问题。