【问题标题】:Why does it print out "abracadabra" and not "Timmy"?为什么它打印出“abracadabra”而不是“Timmy”?
【发布时间】:2014-04-11 09:55:37
【问题描述】:

当我输入“Timmy”作为名称时,此代码会引发异常。我真的不确定机制,但为什么它打印出“abracadabra”而不是“Timmy”。但我可以肯定的一件事是这里没有魔法!

这是短代码

#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!";
}

【问题讨论】:

  • 您在分配后抛出了异常。
  • 如果你想出一个更好的标题,我会赞成这个问题。

标签: c++ exception-handling


【解决方案1】:

你正在抛出一个异常,所以函数永远不会返回:

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 仍然会很神奇

【讨论】:

    【解决方案2】:

    enterName(); 在分配给someName 之前 抛出异常。因此someName 保留其原始值。

    (更详细一点:enterName() 调用 checkName()checkName() 引发异常 since 名称为“Timmy”。enterName() 引发“rtetfrer”。为什么不使用调试器进行验证?)

    【讨论】:

      【解决方案3】:

      为了给someName 赋值,c++ 必须首先计算左侧的表达式。这是函数enterName 的结果。现在在这个函数的执行过程中会抛出一个异常。发生这种情况时,执行会直接跳转到 catch 子句(跳过函数的 return 子句,然后将 someName 分配给这个返回值),因此您永远不会为 someName 分配不同的值。

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

      【讨论】:

        猜你喜欢
        • 2016-06-07
        • 1970-01-01
        • 2016-10-17
        • 1970-01-01
        • 2023-01-11
        • 2017-08-29
        • 2021-09-26
        • 2013-09-23
        • 1970-01-01
        相关资源
        最近更新 更多