我正在对包含多个项目的程序进行异常处理。我决定有一个标题" 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文件中,但我还没有成功。谁能帮我?我也想知道在标题中有这么多类是否好。提前谢谢。
答案 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
错误:
中无法显示负值
错误: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)