什么情况下可以使用异常处理? [关闭]

Posted

技术标签:

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

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

例如:

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

...等等。

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

【问题讨论】:

内存分配失败。 @avakar bad_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】:

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

【讨论】:

以上是关于什么情况下可以使用异常处理? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Python多处理:如何在异常时关闭多处理池

Python 异常处理总结

有效处理Java异常三原则

Koa异常处理说明

异常处理,在这种情况下它是如何工作的

异常处理