如何正确处理标题中的异常?

时间:2014-07-29 16:15:45

标签: c++ exception

我正在对包含多个项目的程序进行异常处理。我决定有一个标题" ExceptionHandling"在一个致力于ExceptionHandling的项目中。因此,我想出了以下代码:     / *此对象管理所有可能的异常:标准/自动和特定* /

#ifndef EXCEPTIONHANDLING_H
#define EXCEPTIONHANDLING_H

//#include "Stdafx.h"

#include <iostream>
#include <exception> // Standard exceptions
using namespace std;

// Longitude Exception
class LonEx: public exception
{
 virtual const char* what() const throw()
  {
      return "**** ERROR: Longitude cannot be higher than 180 degrees\n\n";
  }
} exceptionLongitude;

// Negative Exception
class NegativeEx: public exception
{
  virtual const char* what() const throw()
  {
    return "**** ERROR: Negative value is not possible in ";
  }
} exceptionNegative;

// Xml exception (file cannot be opened)
class XmlEx: public exception
{
      virtual const char* what() const throw()
      {
        return "**** ERROR: XML parsed with errors. Unable to open file called ";
      }
} exceptionXml;

#endif

然后,在文件中捕获异常,我将继续:&#34;抛出exceptionLatitude;&#34;。

当我在两个cpp文件中使用它时,这给了我LNK2005(已经定义)的错误。我试图将定义放在cpp文件中,但我还没有成功。谁能帮我?我也想知道在标题中有这么多类是否好。提前谢谢。

3 个答案:

答案 0 :(得分:3)

您尝试将全局变量用于例外。尝试简化和使用本地对象:而不是声明类和变量只是声明类,例如

class LonEx: public exception
{
 virtual const char* what() const throw()
 {
  return "**** ERROR: Longitude cannot be higher than 180 degrees\n\n";
 }
};

没有exceptionLongitude。然后当你想抛出使用

throw LonEx();

答案 1 :(得分:1)

异常,异常,异常,异常的xml让你搞砸了。你不需要它们。

不要做

throw exceptionXml;

而是做这样的事情:

throw XmlEx();

从.h中删除这些定义(exceptionLongitude,exceptionNegative,exceptionXml),您不需要.cpp。

简而言之,声明属于.h,定义属于.cpp。但是,您不需要定义异常类的实例,以便使用类类型的声明

答案 2 :(得分:0)

如果您所做的只是更改what消息,我会使用具有相应构造函数的内置异常。

  

错误:经度不能高于180度\ n \ n

     

错误:

中无法显示负值

显然是invalid_argument

  

错误:XML解析时出错。无法打开名为

的文件

并且可能是system_error(找不到文件,拒绝权限)。

例如

int mydiv(int x, int y){
    if (y == 0){
        throw std::invalid_argument("**** ERROR: Zero value is not possible as denominator.");
    }
    return x/y;
}

demo