什么情况下可以使用异常处理? [关闭]
Posted
技术标签:
【中文标题】什么情况下可以使用异常处理? [关闭]【英文标题】:Under what circumstances is it feasible to use exception handling? [closed] 【发布时间】:2013-08-26 11:05:02 【问题描述】:我见过许多根本不需要的异常处理机制。很多时候,使用简单的if
语句可以以更简洁的方式解决问题。
例如:
输入无效 除以零 类型错误 容器范围检查 空指针 未初始化的数据...等等。
有人可以提供一个例子来说明处理异常的更好方法吗?
【问题讨论】:
内存分配失败。 @avakarbad_alloc
已经是一个例外,我们别无选择,只能尝试抓住它。我说的是用户定义的代码——什么时候是必要的?
其中大多数通常不会在 C++ 中给出异常。除以零、空指针和未初始化的数据会给出未定义的行为,类型检查(几乎总是)是静态的,标准容器让您可以在检查访问和未检查访问之间进行选择。这只留下“无效输入”,如何处理完全取决于您。
例如,如果我们检测到我们的电源、传感器或执行器有问题。任何可能导致我们系统的未定义行为。
简单的答案是“本地无法处理错误时”;完整的答案会占用一本书的一两章。
【参考方案1】:
随着程序规模的增长,异常变得越来越重要。
使用简单的应用程序返回代码可能没问题。但是,当错误条件需要在堆栈的几层冒泡才能被处理时,使用异常而不是从每个函数传递错误代码开始变得有意义。
另外,当一个方法已经返回一个值时,从函数中返回错误代码可能不切实际或不可能。
【讨论】:
虽然被@Oleksiy 接受为“答案”,但我认为这并不能回答问题。在为给定元素搜索集合时,如果找不到元素则抛出异常在大多数情况下是不合适的。在大多数情况下,返回代码或标志“未找到”会更合适。根据经验,如果结果是 a) 不是真正异常但很常见和/或 b) 失败案例可以在本地处理,我不会使用异常。【参考方案2】:有时使用异常会更干净。在函数 foo
中,由于在 check
函数中抛出异常,您可以避免检查 check
返回的内容是什么使该函数更简单:
#include<iostream>
using namespace std;
class A
public:
int a_foo(int index)return _tab[index];
private:
static int _tab[3];
;
int A::_tab[3]=1,2,3;
void check(int index)
if (index < 0 || index > 2)
throw string("invalid index");
void foo(A a, int index)
check(index);
cout << a.a_foo(index) << endl;
int main()
try
A a;
foo(a,4);
catch(string ex)
cerr << ex <<'\n';
【讨论】:
【参考方案3】:当某些意外的“事件”导致应用程序无法继续运行时,我会使用它。当它发生并且你发现它时,很好地报告它并关闭应用程序(或者在这种情况下你认为你应该做的任何事情)。
【讨论】:
以上是关于什么情况下可以使用异常处理? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章