assert函数:

  C语言和C++都有一个专为调试而准备的工具函数,就是 assert()函数。 这个函数是在C语言的 assert.h 库文件里定义的,所以包含到C++程序里我们用以下语句:

#include <cassert>

  assert()函数需要有一个参数,它将测试这个输入参数的真 or 假状态。 如果为真,Do nothing,继续往下执行! 如果为假,中断执行!

  看下边演示:test.cpp

#include <cassert>

int main()
{
int i = 20;
assert( i == 65 ); return 0;
}

  结果:

test.cpp, line 6

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
请按任意键继续. . .

  演示中,我们看到 assert()函数可以帮助我们调试程序。 我们可以利用它在某个程序里的关键假设不成立时立刻停止该程序的执行并报错,从而避免发生更严重的问题。 另外,除了结合 assert()函数,在程序的开发、测试阶段,我们还可以使用大量的 cout 语句来报告在程序里正在发生的事情。

用户体验与程序猿体验:

 对运行时错误的处理分为两种情况:

  • 一种与程序猿有关,在开发、测试和调试程序的过程中,程序猿需要尽可能详细的信息来查找和纠正各种潜在的运行时错误。
  • 另一种情况与最终用户有关,在使用一个程序的过程中,错误处理应该把用户的感受摆在第一位! 

在理想的情况下,程序发布之前,它里边的所有错误都应该被发现和改正过来。只可惜这是几乎不可能的,就连微软这样的大公司也做不出这样的保证!最为一条原则:最终用户看到的错误信息应该既专业又清晰,不能轻易中断程序,不能充满技术细节。

捕获异常:

  同样为了对付潜在的编程错误(尤其是运行时的错误),捕获异常是一种完全不同的办法。 简单地说,异常(exception)就是与预期不相符合的反常现象。 基本使用思路:

  1. 安排一些C++代码(try语句)去尝试某件事 —— 尤其是那些可能会失败的事(比如打开一个文件或申请一些内存)
  2. 如果发生问题,就抛出一个异常(throw语句)
  3. 再安排一些代码(catch语句)去捕获这个异常并进行相应的处理。

  捕获异常的基本语法如下:

try
{
// Do something.
// Throw an exception on error.
}
catch
{
// Do whatever.
}

  Pay attention!每条 try 语句至少要有一条配对的 catch 语句。必须定义 catch 语句以便让它接收一个特定类型的参数。

  C++还允许我们定义多条 catch 语句,让每条 catch 语句分别对应着一种可能的异常类型:

catch(int e){ … }
catch(bool e){ … }
catch(…){ … }

  最后一条 catch 语句可以捕获任何类型的异常。

 在程序里,我们可以用 throw 保留字来抛出一个异常:throw 1; 在某个 try 语句块里执行过 throw 语句,它后面的所有语句(截止到这个 try 语句块末尾)将永远不会被执行。 与使用一个条件语句或 return 语句相比,采用异常处理机制的好处是它可以把程序的正常功能和逻辑与出错处理部分清晰地划分开而不是让它们混杂在一起。

如何让函数抛出异常:

  你可以在定义一个函数时明确地表明你想让它抛出一个异常,为了表明你想让它抛出哪种类型的异常,可以使用如下所示语法:

type functionName(arguments) throw(type);

  如果没有使用这种语法来定义函数,就意味着函数可以抛出任意类型的异常。 注:有些编译器不支持这种语法,则可省略 throw(type) 部分。

#include <iostream>
#include <climits> unsigned long returnFactorial(unsigned short num) throw (const char *);
//在 returnFactorial函数内可能会抛出字符串类型的异常 int main()
{
unsigned short num = 0; std::cout << "请输入一个整数: ";
while( !(std::cin>>num) || (num<1) )
{
std::cin.clear(); // 清除状态
std::cin.ignore(100, '\n'); // 清除缓冲区
std::cout << "请输入一个整数:";
}
std::cin.ignore(100, '\n'); try
{
unsigned long factorial = returnFactorial(num);
std::cout << num << "的阶乘值是: " << factorial;
}
catch(const char *e)
{
std::cout << e;
} return 0;
} unsigned long returnFactorial(unsigned short num) throw (const char *)
{
unsigned long sum = 1;
unsigned long max = ULONG_MAX; for( int i=1; i <= num; i++ )
{
sum *= i;
max /= i;
} if( max < 1 )
{
throw "悲催。。。该基数太大,无法在该计算机计算求出阶乘值。\n";
}
else
{
return sum;
}
}

TIPS:

  • 如何使用异常是一个很容易引起争论的话题。有些程序员使用异常来处理几乎所有的错误,但C++的创始人Bjarne Stroustrup(BS君)觉得它们正在被滥用。 所以使用异常的基本原则是:应该只用它们来处理确实可能不正常的情况。
  • 作为一条原则,在构造器和析构器里不应该使用异常。一位非常有经验的程序猿在这些方法里成功地使用了异常是有可能的,但稍有不慎就会导致严重的问题。
  • 如果 try 语句块无法找到一个与之匹配的 catch 语句块,它抛出的异常将中止程序的执行。
  • 在C++标准库里有个名为 exception 的文件,该文件声明了一个 exception 的基类。可以用这个基类来创建个人的子类以管理异常。 有经验的程序猿常常这么做,而如此抛出和捕获的是 exception 类或其子类的对象。
  • 如果你打算使用对象作为异常,请记住这样一个原则:以”值传递”方式抛出对象,以”引用传递”方式捕获对象。

  

assert函数和捕获异常的更多相关文章

  1. assert()函数用法总结

    assert()函数用法总结 assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: #include <assert.h> ...

  2. 【php】assert函数的用法

    [php]assert函数的用法 http://www.douban.com/note/217557007/ 2012-06-01 10:32:37   assert这个函数在php语言中是用来判断一 ...

  3. python中assert()函数的使用

    关于assert()函数的使用,主要参考博客https://blog.csdn.net/qq_37119902/article/details/79637578 assert函数主要是用来声明某个函数 ...

  4. 解决用try except 捕获assert函数产生的AssertionError异常时,导致断言失败的用例在测试报告中通过的问题

    在使用Python3做自动化测试过程中可能会遇到,assert函数不加try  except,就可以正常在报告里体现用例不通过,加上变成通过. 这是因为在使用try except 时,捕获了asser ...

  5. assert函数的用法

    assert这个函数在php语言中是用来判断一个表达式是否成立.返回true or false; 例如: <?php $s = 123; assert("is_int($s)" ...

  6. iOS exit(),abort(),assert()函数区别

    iOS exit(),abort(),assert()函数区别 exit() 退出程序 abort() 停止程序, assert()检查里面的参数如果为nil抛出异常:

  7. assert函数应用

    目录 1 assert概念 2 assert作用 3 assert用法 3.1 检测调用者传过来的指针参数是否正常 3.2 判断某个变量的范围 3.3 assert只检验一个地方 3.4 不能使用改变 ...

  8. 【C/C++】assert()函数用法总结

    assert()函数用法总结 assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: #include <assert.h> ...

  9. [XCTF嘉年华体验赛](web)web2 assert函数

    0x00 题目分析 浏览一遍页面,在about页面,获得如下信息 访问 .git/ ,页面存在. 使用githack扒下来.得到源码,进行代码审计. 分析得到: 1.flag在flag页面,要看源码才 ...

随机推荐

  1. 第十章:DOM

    <div class="wrap"> <ul id="ul"> <li>01</li> <li>02 ...

  2. Fortran和C的编译器PGI部署

    平台信息 Description: CentOS Linux release 7.6.1810 (Core) 安装步骤 获取PGCC:社区版是免费的,自带license.dat 解压下载的压缩包:ta ...

  3. Fedora14 mount出现错误时解决办法【亲测有效】

    挂载时出现了如上图所示问题,看第一条英语提示,我刚开始以为是文件权限不够,改了权限之后,依旧存在这样的问题, 于是,我上网查阅了一些资料: 在解决之前,先让我们一起来了解一下nfs: NFS最大功能就 ...

  4. ZK使用

    1. 关注问题 1. zookeeper集群如何保证请求的均匀分布? 由client建立连接时会随机取server保证均匀分布, 2.已布置完成的ZK集群如何扩容? 修改配置后逐台重启即可 2. ZK ...

  5. pat1016. Phone Bills (25)

    1016. Phone Bills (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A long-di ...

  6. 本机访问其它电脑上的oracle数据库

    最近发现很多人问到怎么才能访问别人机子上的oracle,这里来给大家做个示范 借助工具的话,oracle就自己带了两个配置和移值助手下面:net configuration assistant 和ne ...

  7. python方法

    跨模块级(跨文件)的[全局变量的方法] ``` # -*- coding: utf-8 -*- # /modvar.py def _init(): global _module_dict _modul ...

  8. 微信小程序全选多选效果

    效果图: 代码: wxml <view class='hei_top'> <view class='hei_p'>共 <text>4</text> 场& ...

  9. AOP切面编程

    1.JDK动态代理方式实现 public static UserService createService(){ //目标类 final UserService userService = new U ...

  10. Java中的阻塞队列-ArrayBlockingQueue(一)

    最近在看一些java基础的东西,看到了队列这章,打算对复习的一些知识点做一个笔记,也算是对自己思路的一个整理,本章先聊聊java中的阻塞队列 参考文章: http://ifeve.com/java-b ...