(转)assert 断言式编程
编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真。可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新起用断言。
使用断言可以创建更稳定,品质更好且不易于出错的代码。当需要在一个值为FALSE时中断当前操作的话,可以使用断言。单元测试必须使用断言(Junit/JunitX)除了类型检查和单元测试外,断言还提供了一种确定各种特性是否在程序中得到维护的极好的方法。使用断言使我们向按契约式设计更近了一步。
断言特性
使用方式
java断言
1
2
3
4
5
6
7
8
9
|
publicclassAssertExampleOne{ publicAssertExampleOne(){} publicstaticvoidmain(Stringargs[]){ intx=10; System.out.println("TestingAssertionthatx==100"); assertx==100:"Outassertionfailed!"; System.out.println("Testpassed!"); } } |
assert isEnable=true;
1
2
3
4
5
6
7
8
9
10
|
publicclassAssertExampleTwo{ publicstaticvoidmain(Stringargs[]){ booleanisEnable= false ; //... assertisEnable= true ; if (isEnable== false ){ thrownewRuntimeException( "Assertionshoulebeenable!" ); } } } |
使用断言
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include<assert.h> #include<stdio.h> #include<stdlib.h> structITEM { intkey; intvalue; }; /*additemtolist,makesurelistisnotnull*/ voidadditem(structITEM*itemptr) { assert (itemptr!=NULL); /*additemtolist*/ } intmain( void ) { additem(NULL); return0; } |
1
2
3
4
5
6
|
#defineassert(expr)\ ((expr)\ ?__ASSERT_VOID_CAST(0)\ :__assert_fail(__STRING(expr),__FILE__,__LINE__,__ASSERT_FUNCTION)) /*DefinedInGlibc2.15*/ |
如果其值为假(即为0),那么它会打印出来assert的内容和__FILE__, __LINE__,
__ASSERT_FUNCTION,然后执行abort()函数使kernel杀掉自己并coredump(是否生成coredump文件,取决于系统
配置);否则,assert()无任何作用。宏assert()一般用于确认程序的正常操作,其中表达式构造无错时才为真值。完成调试后,不必从源代码中
删除assert()语句,因为宏NDEBUG有定义时,宏assert()的定义为空。[1]
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#include<stdio.h> #include<assert.h> #include<stdlib.h> intmain( void ){ FILE *fp; fp= fopen ( "test.txt" , "w" ); //以可写的方式打开一个文件,如果不存在就创建一个同名文件 assert (fp); //所以这里不会出错 fclose (fp); fp= fopen ( "noexitfile.txt" , "r" ); //以只读的方式打开一个文件,如果不存在就打开文件失败 assert (fp); //所以这里出错 fclose (fp); //程序永远都执行不到这里来 return0; } |
__ASSERT_FUNCTION会让目标变的稍稍大了一点,并不会因为多次使用assert()增加目标很多。不过好处也很明显,就是会在
assert的地方会打印出来文件名,行数,和函数名。另外,要注意用assert()的错误程度。如果assert()的条件fail了,那么会调用
abort()函数让kernel杀掉自己,哪怕用户自己重新注册了SIGABRT信号的行为(abort()会先向自己发送信号SIGABRT保证用户
的handler正确执行,然后修改SIGABRT信号的行为为默认行为coredump,再次像自己发送SIGABRT,coredump)。
//参数:nNewSize缓冲区新长度 //返回值:缓冲区当前长度 //说明:保持原信息内容不变 nNewSize<=0表示清除缓冲区
assert(nNewSize >= 0); assert(nNewSize <= MAX_BUFFER_SIZE); ...}
nOffset+nSize<=m_nInfomationSize);/****好****/assert(nOffset >=
0);assert(nOffset+nSize <= m_nInfomationSize);
Trace.WriteLine("Case 1:"); break; case 2: Trace.WriteLine("Case 2:");
break; default : Debug.Assert(false); break;}
(转)assert 断言式编程的更多相关文章
- cocos2d-x设计模式发掘之五:防御式编程模式
http://www.ityran.com/archives/2105 本文由子龙山人原创,泰然授权转载,转载请注明出处并通知子龙山人! 声明:防御式编程是提高程序代码质量的一种手段,它不能算是真正意 ...
- .NET 4.0 中的契约式编程
契约式编程不是一门崭新的编程方法论.C/C++ 时代早已有之.Microsoft 在 .NET 4.0 中正式引入契约式编程库.博主以为契约式编程是一种相当不错的编程思想,每一个开发人员都应该掌握.它 ...
- Python assert 断言函数
http://blog.csdn.net/hunyxv/article/details/52737339 使用assert断言是学习python一个非常好的习惯,python assert 断言句语格 ...
- Mybatis笔记二:接口式编程
目录 旧方法的弊端 接口式编程 接口式编程的好处 接口式编程的增删改查 旧方法的弊端 在Mybatis笔记一中,我们使用命名空间+id的方式实现了Mybatis的执行,不过这里的命名空间是我们随便写的 ...
- python assert断言函数
python assert断言是声明布尔值必须为真的判定,如果发生异常就说明表达式为假. 可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常. self ...
- python assert 断言详细用法格式
使用assert断言是学习python一个非常好的习惯,python assert 断言句语格式及用法很简单.在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件 ...
- python学习之-- assert断言
assert 断言作用:断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假.可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常.举例如下:a ...
- Spring 5 响应式编程
要点 Reactor 是一个运行在 Java8 之上的响应式流框架,它提供了一组响应式风格的 API 除了个别 API 上的区别,它的原理跟 RxJava 很相似 它是第四代响应式框架,支持操作融合, ...
- [Google Guava] 4-函数式编程
原文链接 译文链接 译者:沈义扬,校对:丁一 注意事项 截至JDK7,Java中也只能通过笨拙冗长的匿名类来达到近似函数式编程的效果.预计JDK8中会有所改变,但Guava现在就想给JDK5以上用户提 ...
随机推荐
- bootstraptable插件文档的坑
1.事件onCheck中文档参数为row, $element正确的顺序为$element,row eg: $Table.on('check.bs.table', function ($element, ...
- Lombok 安装、入门 - 消除冗长的 java 代码
lombok 提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码. lombok 的官方网址:http://projectlombok.org/ lombok 安装1. ...
- java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
参考: http://www.cnblogs.com/sunxucool/archive/2013/06/07/3124380.html ---------------------------&g ...
- Welogic中的JMS
WebLogic JMS 概述 企业消息传递系统使得应用程序能够通过消息的交换与其他系统之间进行通信.消息是包含协调不同应用程序之间通信所需信息的请求.报告和/或事 件.消息提供了提取级别,使您能够从 ...
- thinkPHP 5.0.x 使用SQLite3 进行缓存设置 Cache
1. 配置 thinkPHP cache [application/config.php] 把type设置为sqlite3(默认是小写,第一个字母不区分大小写) 把path换成db,并指定sqlite ...
- 获取tomcat下路径
import java.io.File; public class MainTest { public static void main(String[] args) { //获取是项目的绝对路径 S ...
- 代理 XP”组件已作为此服务器安全配置的一部分被关闭。系统管理员可以使用 sp_configure 来启用“代理 XP”。
新建维护计划的时候遇到下图的报错信息 标题: Microsoft SQL Server Management Studio------------------------------ “代理 XP”组 ...
- Codeforces Round #389 (Div. 2, Rated, Based on Technocup 2017 - Elimination Round 3) A
Description Santa Claus is the first who came to the Christmas Olympiad, and he is going to be the f ...
- 连接MySQL错误:Can't connect to MySQL server (10060)
问题原因: 导致些问题可能有以下几个原因: 1.网络不通: 2.服务未启动: 3.防火墙端口未开放: ----防火墙端口未开放的可能性比较大
- Android4.0.3 USB OTG底层插入上报过程分析(1)
下面的两个宏是PM8058的MMP11(R15),MMP12(P15)管脚.#define EXT_CHG_VALID_MPP 10#define EXT_CHG_VALID_MPP_2 11 sta ...