我是C ++编程的新手,我试图了解C ++中的异常。 我做了一个简单的模型情况,显示了我不理解的东西(我希望我不会把代码弄得太乱)。 我用很少的方法制作了2个基本类(CPerson类基本上是链表)。 我的答案是如何异常停止当前任务。 我可以调用异常,但是任务继续进行,并在程序中造成一些混乱。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;

class CPerson{
 public:
   CPerson(){
     p_next_person = NULL;
   }
   CPerson* p_next_person; // pointer to next person in linked list
   int Postcode(); // returns postcode of person
   friend ostream& operator<<(ostream& stream, const CPerson& pers){
      cout << pers.ID << pers.postcode;
      return stream;
   }
   char* ID;
   int   postcode;
};
//---------------------------------------------------------------
class CPeople{
 public:
   CPeople(){
     first_person = NULL;
   }
   CPerson Person( const char*  personID); // finds person by ID and returns it
   bool NewPerson( const char*  personID, int person_postcode); // add new person
   CPerson* first_person ; // start of linked list

};

//-----------------------------------------------------------------
int CPerson::Postcode(){
    return postcode;
}
//-----------------------------------------------------------------
CPerson CPeople::Person( const char*  personID){
  CPerson* now;
  now = first_person;
  while(now != NULL){
    if(strcmp(now->ID,personID)==0){
      break;
    }
      now = now->p_next_person;
  }
// our person is in now (or now is NULL - if person wasn't found).
    try{
      if(now == NULL ){
        throw 0;
        // I need to stop code here
      }else return *now;
    }
    catch (int e)
    {
      cout << "bla bla " << e << '\n';
    }
  }
//----------------------------------------------------------

int main(){
 CPeople people;
 int i = 0;
 people.NewPerson( "JAck", 100 );
 people.NewPerson( "Josh", 100 );
// Bob is not in people right now.
  i = people.Person("BOB").Postcode();
  cout << i;
 // gives exception, which is nice. but it also changes i to some nonsence .. how do I fix it ?
  cout << people.Person ( "BOB" );
// gives exception, which is nice. but also gives segmentation fault. how do I fix it ?
}

===============>>#1 票数:1 已采纳

您在'throw周围有try块。 try块应该在调用该函数的位置周围,并且应该被catch 因此,您的功能将更改为:

CPerson CPeople::Person( const char*  personID){
  CPerson* now;
  now = first_person;
  while(now != NULL){
    if(strcmp(now->ID,personID)==0){
      break;
    }
    now = now->p_next_person;
  }
  // our person is in now (or now is NULL - if person wasn't found).

  if (now == NULL ){
    throw 0;
    // I need to stop code here
    }
    else return *now;
  }

main看起来像:

int main(){
  try {
    CPeople people;
   int i = 0;
   people.NewPerson( "JAck", 100 );
   people.NewPerson( "Josh", 100 );
   // Bob is not in people right now.
   i = people.Person("BOB").Postcode();
   cout << i;
   // gives exception, which is nice. but it also changes i to some nonsence .. how do I fix it ?
   cout << people.Person ( "BOB" );
   // gives exception, which is nice. but also gives segmentation fault. how do I fix it ?
   }
   catch (int e)
   {
      cout << "bla bla " << e << '\n';
   }
}

一旦通知书catch遇到,后下面的语句catch会被执行。 这就是为什么你应该catch出函数的定义。

===============>>#2 票数:0

像这样的代码

try{
  if( now == NULL ){
    throw 0;
       // I need to stop code here
  } else return *now;
} catch (int e) {
  cout << "bla bla " << e << '\n';
}

完全错了。 无法耸耸肩(“ bla bla”)继续执行,就好像什么都没发生一样。 您可以确保在捕获中满足所有紧急情况,或者应该在更高级别捕获异常。 此处:函数的返回值没有定义,这会在调用CPeople::Person地方引起麻烦。

您可以使用try - catch包围这些呼叫; 在函数中忽略它们,然后抛出。

不要抛出0 使用能够保存某些信息的对象。 按价值投掷,按参考捕获。

  ask by user3512285 translate from so

未解决问题?本站智能推荐:

2回复

C ++中的I / O异常问题(“ cin”语句)

在以下程序中: 我正在使用两种异常。当程序抛出“ runtime_error”异常但遇到“ invalid_argument”异常时,它将进入无限循环。 实际上,catch块中的“ cin>>c ”语句中存在问题,但无法弄清楚,为什么会这样。
3回复

C ++中异常内部的异常

使用C#或Java时,我曾经创建了包含其他异常作为类成员的异常类。 例如: 我正在寻找同一主题的例子,但对于C ++我找不到任何(也许我没有找到正确的术语,因为你可以看到这个问题的标题不是很花哨)。 无论如何,在C ++中这样做的正确方法是什么? 它是将内部异常存储为指针还是引
2回复

C ++:如何使用异常处理从超出范围的数组中返回值?

我在使用异常形式主义返回边界数组的值时遇到麻烦。 我使用类Array在主脚本中创建了一个长度为10的数组对象。 比我尝试将数组的第11个元素设置为某个值。 在我的Array类中,当数组的索引大于数组的大小时,我从ArrayOutOfBounds类中返回一个值,在这种情况下,这是正确的。
11回复

C ++ - 返回代码异常的参数

我正在讨论在新的C ++项目中采用哪种方式。 由于以下原因,我赞成异常而不是返回代码(仅限特殊情况) - 构造函数无法提供返回代码 将故障路径(应该非常罕见)与更清晰的逻辑代码分离 在非特殊情况下更快(不检查是否/否则数十万次) 如果有人搞砸了返回代码设置(
2回复

c ++异常返回类型为什么char *

有人可以解释为什么自编的C ++异常,从异常继承返回一个char *而不是一个字符串? 资料来源: http : //www.cplusplus.com/doc/tutorial/exceptions/
6回复

C ++返回值与异常性能

在某些地方,我已经读到现代英特尔处理器具有用于实现异常的低级硬件,并且大多数编译器都利用它,因为异常变得比使用变量返回结果状态更快。 这是真的吗? 就返回状态/响应状态而言,是否比变量更快? 读取堆栈溢出的话题似乎与此相矛盾。 谢谢
5回复

抛出异常后我需要返回(c ++和c#)

我有一个生成异常的函数。 例如,以下代码: 抛出异常后我需要返回吗? c#是什么情况?
7回复

Google的“Go”语言多值返回语句是否可以替代异常?

在我看来,Google的例外替代方案是 GO:多值返回“return val,err;” GO,C ++:零检查(提前退货) GO,C ++:“处理该死的错误”(我的任期) C ++:断言(表达式) GO:延迟/恐慌/恢复是在询问此问题后添加的语言功能
1回复

POCO C ++中的SSL异常

当我使用完成建筑POCO库时 首先我感到很高兴,因为我可以使用HTTPS编写程序。但是,我遇到了一个异常 当我使用HTTPSClientSession发送请求时,我的代码如下: 恩,我的代码正确吗? 这是我第一次使用此库。希望大家帮助我,谢谢!!!
3回复

C ++中异常的使用

在我的项目编码中,我必须使用try catch方法来查找函数执行状态。 我的要求是我必须捕捉从try块引发的所有异常 我在这里有两个选择, 抓住(...) 捕捉(标准::例外) 我认为第一个将捕获所有异常。 第二个是std :: exception是我程