【转】使用断言NSAssert()调试程序错误

NSAssert()只是一个宏,用于开发阶段调试程序中的Bug,通过为NSAssert()传递条件表达式来断定是否属于Bug,满足条件返回真值,程序继续运行,如果返回假值,则抛出异常,并切可以自定义异常描述。NSAssert()是这样定义的:

#define NSAssert(condition, desc)

condition是条件表达式,值为YES或NO;desc为异常描述,通常为NSString。当conditon为YES时程序继续运行,为NO时,则抛出带有desc描述的异常信息。NSAssert()可以出现在程序的任何一个位置。具体事例如下:

生成一个LotteryEntry对象时,传入的NSDate不能为nil,加入NSAssert()判断。对象初始化源码如下:

- (id)initWithEntryDate:(NSDate *)theDate
{

self =
[super init];

if (self)
{

NSAssert(theDate
!= nil, @"Argument must be
non-nil");

entryDate =
theDate;

firstNumber =
(int)random()
% 100 + 1;

secondNumber =
(int)random()
% 100 + 1;

}

return  self;

}

接下来则是生成对象时传入一个值为nil的NSDate,看断言是否运行。

LotteryEntry *nilEntry =
[[LotteryEntry alloc] initWithEntryDate:nil];

断言效果如下:

2013-01-17 20:49:12.486 lottery[3951:303] *** Terminating app
due to uncaught exception ‘NSInternalInconsistencyException‘,
reason: ‘Argument must be non-nil‘

*** First throw call stack:

(

0   CoreFoundation 
     
     
     
  0x00007fff90c590a6 __exceptionPreprocess +
198

1   libobjc.A.dylib  
     
     
     
0x00007fff8fd2a3f0 objc_exception_throw + 43

2   CoreFoundation 
     
     
     
  0x00007fff90c58ee8 +[NSException
raise:format:arguments:] + 104

3   Foundation 
     
     
     
     
0x00007fff88dae6a2 -[NSAssertionHandler
handleFailureInMethod:object:file:lineNumber:description:] +
189

4   lottery  
     
     
     
     
  0x0000000100001929 -[LotteryEntry
initWithEntryDate:] + 249

5   lottery  
     
     
     
     
  0x0000000100001794 main + 932

6   libdyld.dylib  
     
     
     
  0x00007fff8d83f7e1 start + 0

)

libc++abi.dylib: terminate called throwing an exception

时间: 2024-12-19 07:46:43

【转】使用断言NSAssert()调试程序错误的相关文章

断言NSAssert的使用

1. NSAssert 断言(NSAssert)是一个宏,在开发过程中使用NSAssert可以及时发现程序中的问题. NSAssert声明如下: #define NSAssert(condition, desc, ...) condition:条件表达式.条件成立时,运行后面程序:不成立时,抛出带有desc描述的异常信息. desc:异常描述,通常为NSString类型对象.用于描述条件表达式不成立的错误信息和参数的占位符. ...:desc字符串中的参数. 假设我们需要判断变量值是否大于5,我

assert断言语句调试程序

之前工作在测试中经常会碰到断言挂起,每次出现断言只知道有故障了,但是并没有深究断言是怎么回事,今天学习了python中的断言语句,其实挺简单. 1.assert语句的语法: assert expression [,reason] expression :表达式为真时,什么都不做,表达式为假时,抛出AssertionError异常: reason:可选参数,用于对判断条件进行描述,为了以后更好的知道哪里出现了问题. 2.assert语句只在调试阶段有效.所以我们平时测试用的debug版本才会有断言

iOS 笔记

1. 使用断言NSAssert()调试程序错误 NSAssert()只是一个宏,用于开发阶段调试程序中的Bug,通过为NSAssert()传递条件表达式来断定是否属于Bug,满足条件返回真值,程序继续运行,如果返回假值.则抛出异常,并且可以自定义异常描述.NSAssert()是这样定义的: #define NSAssert(condition, desc) condition是条件表达式,值为YES或NO;desc为异常描述,通常为NSString.当condition为YES时程序继续运行,为

Swift开发之异常处理及断言(一)

本篇分两部分: 1.错误和异常处理 2.Swift 中的断言 1.错误和异常处理 在 OC 开发中,我们通常会将 error 置为 nil NSError *error; BOOL success = [data writeToFile: path options: options error: &error]; if(error) { // 错误信息 } 在绝大多数情况下,这个方法并不会发生什么错误,所以我们将 error 直接设置为 nil.但是出错的时候可能就会无从下手进行调试.在 Swi

ios之断言更胜于NSLog

有时候我们需要不断的输出以用来调试程序,断言这个东西很少被人用到.今天看网上一大神写的代码 NSAssert(!gMenu, @"singleton object"); NSParameterAssert(view); 便查了下文档 #define NSParameterAssert(condition) NSAssert((condition), @"Invalid parameter not satisfying: %s", #condition) #if !d

【软件构造】第七章第三节 断言和防御性编程

第七章第三节 断言和防御性编程 本节:第2种技术--断言.防御式编程 Outline 断言 什么是断言 断言的应用场景 防御式编程(不是考点,不加叙述) Notes: ## 断言 [什么是断言] 作用:允许程序在运行时检查自己,测试有关程序逻辑的假设,如前置条件.后置条件.内部不变量.表示不变量.控制流不变量等 目的: 为了在开发阶段调试程序.尽快避免错误 使用阶段: 断言主要用于开发阶段,避免引入和帮助发现bug 实际运行阶段, 不再使用断言 软件发布阶段,禁用断言避免影响性能. [应用场景]

10.Android UiAutomator Junit 断言函数的使用

一.断言函数介绍 1.断言函数: 确定被测试的方法是否按照预期的效果正常工作 比如说: if (假设成立){ 通过测试 }else{ 报错并终止当前用例测试 } 2.断言函数用例结构: 一个完整的测试用例必需要有断言函数 setUp//初始化 //测试用例,junit4版本才可以使用多条用例 test 初始化场景与数据 test 模拟操作步骤 test 断言 test 恢复场景 tearDown//回收初始化垃圾 3.断言函数Java错误类型: 1)Error: 一般是指与虚拟机相关的问题,如系

Junit 4.7 Rule:另一种断言异常的方法(ExpectedException)

在Junit 4.7之后,加入了一种更容易断言异常以及异常信息的方法. 异常处理 //验证抛出异常类,以及错误信息 public class TestException { @Rule public ExpectedException expectedEx = ExpectedException.none(); @Test public void testValidationException() throws ValidationException { //断言会抛出的异常,这句一定要在抛出异

第一周-泛读教材

第一堂课上老师就要求我们在一个周内看完课本,然后提出自己不懂的地方.用了一周的时间,我大概读完了这本书,以下是我在这本书中所遇到的不解之处: 1.在书的第二章<个人技术和流程>中,有这样一段文字:软件实体应该是可以扩展的,同时是不可修改的.当时的疑惑是怎么才能做到可以扩展但是又不可修改,然后看了下面给出的解释是说当需求发生变化时,我们可以对模块进行扩展,从而来改变模块的功能:但是对模块进行扩展时,不必改变模块的本身.这确实是一个可以实现的办法,但是就实际的实践来说,当新的需求出现的时候,我们是