首页 / 知识
关于函数:我应该在C ++中使用异常说明符吗?
2023-04-16 21:49:00

Should I use an exception specifier in C++?在C ++中,您可以通过使用异常说明符指定函数可能会也可能不会抛出异常。 例如:
由于以下因素,我对实际使用它们表示怀疑:
你认为应该使用异常说明符吗? 没有。 以下是几个例子: 使用异常规范无法编写模板代码,
副本可能会抛出,参数传递可能会抛出,而 异常规范往往会禁止可扩展性。
可能演变成
你真的可以这样写
第一个是不可扩展的,第二个是过于雄心勃勃的,第三个是你在写虚拟函数时的意思。 遗留代码 当你编写依赖于另一个库的代码时,你真的不知道当出现可怕的错误时它会做什么。
当 编写返回常见错误的代码,并在特殊情况下抛出。
然而,当您的库只是抛出自己的异常时,您可以使用异常规范来陈述您的意图。 避免使用C ++中的异常规范。你在问题中提出的原因是一个很好的开始。 参见Herb Sutter的"实用的异常规范"。
我认为标准除了约定(对于C ++) 另外我认为值得描述异常保证。
这些基本上是关于如何通过转义该对象上的方法的异常来影响对象状态的文档。不幸的是,它们没有被编译器强制执行或以其他方式提及。 例外保证 无保证:
基本保证:
强有力的保证:(又称交易保证)
无投保证:
当您违反异常规范时,gcc将发出警告。我所做的是使用宏只在"lint"模式下使用异常规范明确编译以检查以确保异常与我的文档一致。 唯一有用的异常说明符是"throw()",如"不抛出"。 在C ++中,异常规范并不是非常有用的工具。但是,如果与std :: unexpected结合使用,它们/它们是很好用的。 我在一些项目中所做的是具有异常规范的代码,然后使用一个函数调用set_unexpected(),该函数会抛出我自己设计的特殊异常。这个异常在构造时会得到一个回溯(以特定于平台的方式),并从std :: bad_exception派生(允许它在需要时传播)。如果它像通常那样导致terminate()调用,则回溯由what()(以及导致它的原始异常;不难找到)打印,因此我得到了我的合同所在的信息违反了,例如抛出了意外的库异常。 如果我这样做,我从不允许传播库异常(除了std之外)并从std :: exception派生所有异常。如果一个库决定抛出,我将捕获并转换为我自己的层次结构,允许我始终控制代码。调用依赖函数的模板函数应该出于明显的原因避免异常规范;但是很少有模板化的函数接口与库代码(很少有库真的以有用的方式使用模板)。 否。如果您使用它们并且未通过您的代码调用的代码或代码指定了未指定的异常,则默认行为是立即终止您的程序。 此外,我相信它们的使用在C ++ 0x标准的当前草案中已被弃用。 "throw()"规范允许编译器在进行代码流分析时执行一些优化,如果它知道函数永远不会抛出异常(或者至少承诺永不抛出异常)。 Larry Osterman在这里简要介绍了这个问题: http://blogs.msdn.com/larryosterman/archive/2006/03/22/558390.aspx 如果您编写的代码将由人们使用,而不是查看函数声明而不是围绕它的任何注释,那么规范将告诉他们他们可能想要捕获哪些异常。
否则我发现除了 它们可用于单元测试,因此在编写测试时,您知道函数在失败时会发生什么,但在编译器中没有强制执行它们。我认为它们是C ++中不需要的额外代码。您选择的所有内容都是您在整个项目和团队成员中遵循相同的编码标准,以便您的代码保持可读性。 是的,如果你是内部文档。或者也许写一个别人会使用的图书馆,这样他们就可以在不查阅文档的情况下告诉会发生什么。投掷或不投掷可以被视为API的一部分,几乎就像返回值一样。 我同意,它们对于在编译器中强制执行Java风格并不是很有用,但它总比没有任何东西或随意的评论更好。 通常我不会使用异常说明符。但是,如果任何其他例外来自相关函数,该程序肯定无法纠正,那么它可能是有用的。在所有情况下,请务必清楚地记录该功能可能出现的异常情况。 是的,从具有异常说明符的函数抛出的非指定异常的预期行为是调用terminate()。 我还要注意Scott Meyers在更有效的C ++中解决了这个问题。他的有效C ++和更高效的C ++是强烈推荐的书籍。 来自文章: http://www.boost.org/community/exception_safety.html
事实上,我可以想办法使模板类异常安全。除非您无法控制所有子类,否则您可能会遇到问题。为此,可以在类中创建typedef,以定义各种模板类抛出的异常。我认为这个问题总是在事后处理,而不是从一开始就设计它,我认为这是开销,这是真正的障碍。 例外规范=垃圾,问任何30岁以上的Java开发人员 |
最新内容
相关内容
linux调用函数的命令?
linux调用函数的命令?,系统,代码,策略,上调,时间,设计,通信,网络,设备,项目,如何在Linux内核里增加一个系统调用?在一个进程中创建3个线程,名字linux命令和库函数?
linux命令和库函数?,系统,标准,管理,地址,服务,库函数,环境,平台,第一,状态,1.linux系统调用和库函数调用的区别系统调用和库函数在执行的效果linux查看函数命令?
linux查看函数命令?,系统,信息,名称,命令,位置,情况,公用,名字,标准,资料,linux下有没有像查看函数那样直接使用man命令来查看结构体的命令?这调用函数命令linux?
调用函数命令linux?,系统,管理,网络,通用,统一,观察,地址,代码,设备,地方,怎么调用system函数,使用Android的linux命令1、int system(const chlinux查询函数命令?
linux查询函数命令?,系统,信息,名称,标准,函数,百度,代码,名字,最新,实时,Linux下查找一个函数在哪个库文件中1、默认状态下,gcc并不搜索数学库深入理解python函数传参机制
深入理解python函数传参机制,培训,对象,函数,变量,类型,复本,下面,操作,机制,内存,首先需要申明的一点是,python里是没有像C和C++里那样按值传Python中的匿名函数lambda
Python中的匿名函数lambda,代码,地方,名字,主体,名称,培训,函数,表达式,赋值,语句,简述除了def语句之外,Python还提供了一种生成函数对象的表Python有哪些常用函数?
Python有哪些常用函数?,数据,函数,地址,数字,培训,工作,网络,位置,字符串,字符,Python常用函数有哪些?我想大家都比较好奇这个问题,今天小编特python的filter,lambda函数表达式
python的filter,lambda函数表达式,代码,函数,名称,培训,列表,参数,知识点,表达式,约数,元素,filter(functionorNone,sequence),其中sequence可python字符串处理函数大总结
python字符串处理函数大总结,位置,数字,异常,培训,字符串,空格,长度,两边,字母,函数,str=pythonStringfunction生成字符串变量str=pythonStriPython列表操作的函数和方法
Python列表操作的函数和方法,位置,培训,列表,元素,操作,函数,末尾,方法,对象,以下,·Python列表操作包含以下函数:1、cmp(list1,list2):比较两python中文件操作的一些函数
python中文件操作的一些函数,培训,文件,函数,模式,操作,序列,二进制文件,标识符,列表,括号,文件操作的所有函数:注意python2与3有些函数的用法