标签:strong nothing 结合 signed lease something 思路 异常处理 使用
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)就是与预期不相符合的反常现象。 基本使用思路:
捕获异常的基本语法如下:
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:
标签:strong nothing 结合 signed lease something 思路 异常处理 使用
原文地址:https://www.cnblogs.com/tianqizhi/p/10450145.html