当前位置:  开发笔记 > 编程语言 > 正文

在异常规范中仅使用std :: exception

如何解决《在异常规范中仅使用std::exception》经验,为你挑选了1个好方法。

似乎普遍接受的是,异常规范并没有像人们想象的那样有所帮助.但我想知道只使用std :: exception的规范是否是一个很好的折衷方案:

void someFunction()
    throw ( std::exception );

它记录了此方法/函数可能抛出异常的事实.

它将确保仅抛出从std :: exception派生的异常,而不是某些外来类,如std :: string或int.

那么,这会更好,然后根本没有任何规格吗?

更新:

关于运行时 - 开销:将其视为断言的使用.无论运行时开销如何,您都在使用断言,对吧?我知道你通常可以为发布版本禁用它们,所以可能更好的方法是将异常规范包装在一个宏中,这样你就可以为发布版本禁用它.就像是:

#ifdef DEBUG
    #define THROW( exception ) throw ( exception )
#else
    #define THROW( exception )
#endif

void someFunction()
    THROW( std::exception );

Martin York.. 8

是的,但是如果抛出不是从std :: exception派生的东西,你会发生什么?

您希望应用程序终止吗?
没有堆栈展开而不是调用析构函数来整理代码,只是应用程序退出.

Java和C++异常规范之间的区别在于Java在编译时检查规范.另一方面,C++在运行时进行所有检查.因此,当您的规格被违反时,已经太晚了.

即使在Java代码中也有一种停止使用它们的动作.在项目开始时,往往会发生的事情是严格定义异常规范.但随着代码的增长和变得越来越复杂,规范被稀释为越来越普遍的形式.这是因为随着代码增长,可以抛出更多异常,如果无法立即处理它们,则需要将整个调用链的异常规范修改回可以处理它们的位置.(注意我不是Java专家,但我确实在一个成熟的Java代码库中发挥作用).

值得一提的唯一异常规范(我认为)是无投注规范.这确实有一个有效的应用程序(但你必须使用它与try/catch(...)块).

另请阅读Herb Sutters文章:

SO上的这个帖子:我应该在C++中使用异常说明符吗?



1> Martin York..:

是的,但是如果抛出不是从std :: exception派生的东西,你会发生什么?

您希望应用程序终止吗?
没有堆栈展开而不是调用析构函数来整理代码,只是应用程序退出.

Java和C++异常规范之间的区别在于Java在编译时检查规范.另一方面,C++在运行时进行所有检查.因此,当您的规格被违反时,已经太晚了.

即使在Java代码中也有一种停止使用它们的动作.在项目开始时,往往会发生的事情是严格定义异常规范.但随着代码的增长和变得越来越复杂,规范被稀释为越来越普遍的形式.这是因为随着代码增长,可以抛出更多异常,如果无法立即处理它们,则需要将整个调用链的异常规范修改回可以处理它们的位置.(注意我不是Java专家,但我确实在一个成熟的Java代码库中发挥作用).

值得一提的唯一异常规范(我认为)是无投注规范.这确实有一个有效的应用程序(但你必须使用它与try/catch(...)块).

另请阅读Herb Sutters文章:

SO上的这个帖子:我应该在C++中使用异常说明符吗?

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有