异常
传统C中处理错误的方式
以往我们在写C语言程序时,当用户的错误输入或者非期望结果发生时我们的程序有可能就会开始不正确的走向,此时我们为了程序的可靠性和健壮性往往需要对结果进行判断,并且防止一些非预期行为的发生。在C语言中我们程序在发生错误时我们往往会通过以下几种方式来阻止程序继续向错误方向执行,并且向外返回错误。
返回错误码
返回错误码就是我们常说的返回值,每个函数都有一个返回值,我们可以返回一个整形数据来告知外部执行的函数发生了什么问题。可是这样的返回错误码的方式不便于使用,我们为了搞懂错误是什么还不得不去查询手册,而且如果在主函数中返回的话程序会直接返回错误码终止程序。
终止程序
在C中有类似assert
的断言函数供我们判断状态,保证错误的发生,可是当不符合assert
的要求时,它会直接终止程序,并且给我们一个终止位置让我们自己去找错误,这不仅不便于查找错误甚至还让用户难以接收,谁都不想因为一点小错程序自己就会挂掉。
非本地跳转
在C语言的标准库中有这么一组函数setjmp
和longjmp
用于实现非本地跳转,setjmp
用于设置跳转点,longjmp
用于进行跳转(这里的跳转已经类似于Cpp的异常处理,异常处理也是在他们的基础上进行完善实现),但是他们两个并不常用。
Cpp异常处理
Cpp的异常处理更加人性化,更加方便,它可以帮助用户更加直观的理解错误,并且还能保证程序可以不会退出继续按照我们的要求继续执行
关键字
在Cpp中关于异常处理一共有三个关键字try,catch, throw
。
try
用于将有可能抛出异常的代码包裹,这些代码被称为保护代码。try
后面必须至少跟一个catch
。
throw
用于抛出异常,throw
必须在try
包裹的保护代码中使用才能起到正常的效果。
catch
用于捕获异常以及处理异常,跟在try
的后面。
使用格式
try
{
throw ...;
}
catch(...)
{
}
catch(...)
{
}