【问题标题】:Under what circumstances is it feasible to use exception handling? [closed]什么情况下可以使用异常处理? [关闭]
【发布时间】:2013-08-26 11:05:02
【问题描述】:

我见过许多根本不需要的异常处理机制。很多时候,使用简单的if 语句可以以更简洁的方式解决问题。

例如:

  • 输入无效
  • 除以零
  • 类型错误
  • 容器范围检查
  • 空指针
  • 未初始化的数据

...等等。

有人可以提供一个例子来说明处理异常的更好方法吗?

【问题讨论】:

  • 内存分配失败。
  • @avakar bad_alloc 已经是一个例外,我们别无选择,只能尝试抓住它。我说的是用户定义的代码——什么时候是必要的
  • 其中大多数通常不会在 C++ 中给出异常。除以零、空指针和未初始化的数据会给出未定义的行为,类型检查(几乎总是)是静态的,标准容器让您可以在检查访问和未检查访问之间进行选择。这只留下“无效输入”,如何处理完全取决于您。
  • 例如,如果我们检测到我们的电源、传感器或执行器有问题。任何可能导致我们系统的未定义行为。
  • 简单的答案是“本地无法处理错误时”;完整的答案会占用一本书的一两章。

标签: c++ exception exception-handling


【解决方案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】:

    当某些意外的“事件”导致应用程序无法继续运行时,我会使用它。当它发生并且你发现它时,很好地报告它并关闭应用程序(或者在这种情况下你认为你应该做的任何事情)。

    【讨论】:

      猜你喜欢
      • 2014-07-30
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 1970-01-01
      • 2020-12-05
      • 2020-03-08
      • 1970-01-01
      • 2020-12-30
      相关资源
      最近更新 更多