这篇文章主要介绍“C++怎么通过抛出异常来表明函数无法执行指定的任务”,在日常操作中,相信很多人在C++怎么通过抛出异常来表明函数无法执行指定的任务问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++怎么通过抛出异常来表明函数无法执行指定的任务”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
E.2:通过抛出异常来表明函数无法执行指定的任务
To make error handling systematic, robust, and non-repetitive.
为了使用错误处理系统化,健壮和不繁琐。
Example(示例)
struct Foo {
vector<Thing> v;
File_handle f;
string s;
};
void use()
{
Foo bar {{Thing{1}, Thing{2}, Thing{monkey}}, {"my_file", "r"}, "Here we go!"};
// ...
}
这里vector和string的构造函数可能无法为它们的元素分配足够的内存,vector构造函数可能无法复制初始化列表中的内容,File_handle有可能无法打开需要的文件。每种情况中,它们都会向调用者抛出异常以便处理。如果use()可以处理构造bar对象时的错误,它们可以通过try/catry获得控制。其他情况下,Foo的构造函数可以在将控制权交给试图构建Foo的代码之前正确地销毁已经构造完成的成员。注意,代码中没有可以容纳错误码的返回值。
The File_handle constructor might be defined like this:
File_handle的构造函数可能被定义成下面的样子:
File_handle::File_handle(const string& name, const string& mode)
: f{fopen(name.c_str(), mode.c_str())}
{
if (!f)
throw runtime_error{"File_handle: could not open " + name + " as " + mode};
}
It is often said that exceptions are meant to signal exceptional events and failures. However, that's a bit circular because "what is exceptional?" Examples:
一般情况下会认为异常意味着重大的例外事件和错误。然而,这个问题多少有点绕,到底什么是例外?例如:
A precondition that cannot be met
一个前提条件没有满足
A constructor that cannot construct an object (failure to establish its class's invariant)
构造函数无法构造对象(无法建立类的不变式)
An out-of-range error (e.g., v[v.size()] = 7)
越界错误(例如 v[v.size()]=7)
Inability to acquire a resource (e.g., the network is down)
无法获取资源(例如:网络断)
In contrast, termination of an ordinary loop is not exceptional. Unless the loop was meant to be infinite, termination is normal and expected.
相反,结束一个通常的循环不属于异常。只要它不是无限循环,中止就是正常和期待的。
Note(注意)
Don't use a throw as simply an alternative way of returning a value from a function.
不要使用将抛出异常作为从函数中返回结果的另一种方式使用。
Exception(例外)
有些系统,例如硬实时系统要求保证一个动作在开始执行之前就能确定其执行时间小于某个固定值(通常很小)。这样的系统只有在存在某种可以准确预测系统从抛出异常过程中恢复的最大时间的工具时才可以使用异常。
到此,关于“C++怎么通过抛出异常来表明函数无法执行指定的任务”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。