当我输入" Timmy"时,此代码会引发异常。作为名字。我真的不确定机制,但为什么打印出来" abracadabra"而不是"蒂米"。但我确定的一点是,这里没有魔法!
这是短代码
#include <iostream>
using namespace std;
#include <string>
#include <cstdlib>
string enterName();
void checkName(string);
int main()
{
string someName = "abracadabra";
try {
someName = enterName();
}
catch(const char* error) {
cout << "main function says: "<<error <<endl;
}
cout << "Name: "<<someName<<endl;
return 0;
}
string enterName()
{
string s;
cout<<"Enter a name: ";
cin >> s;
cout<<endl;
try {
checkName(s);
}
catch(const char* err) {
cout << "middle man says: "<<err <<endl;
throw "rtetfrer";
}
return s;
}
void checkName(string name)
{
if (name == "Timmy")
throw "Help, Timmy's been kidnapped by a giant squid!";
}
答案 0 :(得分:2)
您正在抛出异常,因此函数永远不会返回:
void checkName(string name)
{
if (name == "Timmy")
//This throws an exception, so the function exits immediately
throw "Help, Timmy's been kidnapped by a giant squid!";
}
这个例外被发现:
try {
checkName(s);
}
catch(const char* err) {
//This will be the exception that timmy is caught
cout << "middle man says: "<<err <<endl;
//This will throw an exception and immediately exit the function
throw "rtetfrer";
}
//This will never be called
return s;
新异常将在此处发现:
catch(const char* error) {
cout << "main function says: "<<error <<endl;
}
但由于checkName
永远不会返回值,somename
仍然是魔法
答案 1 :(得分:1)
enterName();
在someName
的作业发出之前之前会抛出异常。因此someName
保留其原始价值。
(更详细一点:enterName()
调用checkName()
。checkName()
抛出异常since
名称为“Timmy”。enterName()
抛出“rtetfrer” 。为什么不用调试器验证?)
答案 2 :(得分:0)
要为someName
分配值,c++
必须首先评估左侧的表达式。这是函数enterName
的结果。现在,在执行此函数期间会抛出异常。当发生这种情况时,执行会直接跳转到catch子句(跳过函数的return子句,然后将someName
赋值给此返回值),因此您永远不会为someName
分配不同的值。
使用调试器以更简单的方式跟踪执行流程。