为什么打印出来" abracadabra"而不是"蒂米"?

时间:2014-04-11 09:55:37

标签: c++ exception-handling

当我输入" 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!";
}

3 个答案:

答案 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分配不同的值。

使用调试器以更简单的方式跟踪执行流程。