什么时候用异常,什么时候用断言?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么时候用异常,什么时候用断言?相关的知识,希望对你有一定的参考价值。

参考技术A

契约式编程

对于异常和断言,个人认为最明显的是“契约编程”。总之,在检查前使用ASSERT,检查后使用条件。

1.在函数的情况下,它需要在满足一系列条件时,这些条件称为“条件”或“先验条件”,例如,参数不是null,全局变量应该是1,以此类推。在不满足前提条件下调用该函数是不可能的,如果条件不满足,就可以调用该函数,这可以看作是一个设计错误。

2.检查前提条件,您可以使用ASSERT。在函数之后,也可以满足一系列条件,这些条件称为“后条件”或“后验”,如返回值满足关系,一个全局变量称为什么,等等。这应该是函数执行的结果,在满足前条件的条件下,如果不满足条件是异常情况,则使用异常处理。例如,函数strcpy,其前提为1,第一个参数是一个空结束字符串;2。第二个参数指向的内存空间足以用于复制。所以我们可以使用ASSERT来检查这两个条件是否满足。

3.下面的条件应该与第二个参数指向的内存空间中的字符串和第一个参数相同在函数完成后,我们可以检查是否相同,如果不相同,可以抛出异常(例如,空格是另一个线程写异常,或者因为系统原因内存同时也是对其他的,等等)。当然,strcpy实际上并没有在效率方面做这些测试。合同程序设计的前一个条件不满足程序的错误,需要修改,这也符合通常的理解,即断言是程序错误;条件不满足往往也是一些事故的原因,也与一般认识的发生异常是事故情况的一致。

总之契约式编程但是有一个问题是“不变”,不变是指函数之前和之后都不改变,我明白,之前的函数可以用来维护检查不变,执行后如果发现相同的类型发生了变化,那么您应该抛出一个异常。

参考技术B

断言

是用于你知道永远不会发生的事情,但是因为人们总是犯错误,确保你写的东西和你想的不一样。所以断言用来捕获的是程序员自己的错误。



同样,异常捕获用户或环境中的错误。

断言不以一个函数为例,它需要在执行开始时满足一系列条件。

这些条件称为“预条件”或“先验条件”,例如,参数不是空的,全局变量应该是1。如果我们不满足前提条件,就不能调用这个函数。如果不满足前提条件,仍然可以称之为设计错误。检查预条件,可以使用断言。应该用于验证输入数据到公共方法或命令行参数。时会是一个更好的选择。在公共方法中,只使用断言检查它们不应该发生的事情。

执行此函数后,它还将满足一系列条件。这些条件称为后置条件或后验条件,例如返回值满足什么关系,为什么要调用全局变量集,为什么,等等。这应该是函数执行的结果。如果前提满足,如果后置条件不满足,则是异常情况,则用异常处理。

几个注意

1。不是所有的C++编译器,使异常的功能,或编译器的支持,该函数是由编译器选项禁止。2基于宏观的断言是检查一个值是否符合你的期望,而不是直接脱离程序,你没有恢复的空间。3基于宏断言,通常在调试编译模式下,发布代码的断言无效。这就是用户在没有这些断言的情况下得到的结果。(因为断言是程序员的调试工具)你能接受吗?4 C++ 11有static_assert关键词,这不是一个宏。但他的目的是检查某些常量是否与编译期间的期望一致。

参考技术C

其实我个人觉得就是在检查前使用ASSERT,检查后使用异常吧。

什么是断言和异常

其实断言是指来被用来检查的非法情况而不是错误的情况,程序在正常工作的时候是绝对不会或者说不应该发生的非法情况的。这样才让用来帮助开发人员对有问题的地方进行快速的定位。在增强程序的容错性时候,用来减少程序使用中对用户不有好的行为,不让用户知道发生了什么错误,才使用异常来处理的。


断言和异常的用法

其实个人来说这样理解吧,断言其实是表示你的程序是写错了啊,只要有断言的发生的时候,就要修改代码的。这样来说其实断言就是说编译错误的意思啊。

那么如果说代码的写法是完全正确的时候呢,但是因为受到了外界的环境或者说是因为用户的操作还是可能发生一些事情的,这样就不应该用断言了,就应该使用异常了。

所以说其实对于断言还有异常来说,对不同语言来说含义不同,不可一概而论。


总结

其实断言就是程序中的“契约”。但是在一些软件工程的设计来说,断言和一场都不是常用的方法的。


其实就是说在异常的时候,基本上是不会立刻的停止运作的啊,可是在断言的时候才是会在发现问题的时候是立刻的停止运行的。这个也是最大的区别,这样可就可以清楚到底是在什么时候用断言和异常的吧。

以上是关于什么时候用异常,什么时候用断言?的主要内容,如果未能解决你的问题,请参考以下文章

异常处理的其他内容

10.异常处理自定义异常断言

《java程序设计》

java啥时候需要抛出异常

什么时候用assert

断言什么时候用?