当前位置:  开发笔记 > 编程语言 > 正文

在C++中创建新的异常

如何解决《在C++中创建新的异常》经验,为你挑选了4个好方法。

我有一个C++类,我试图在Ubuntu中运行它:

#ifndef WRONGPARAMETEREXCEPTION_H_
#define WRONGPARAMETEREXCEPTION_H_

#include 
#include 
#include 

using namespace std;

#pragma once

class WrongParameterException: public exception
{
    public:
        WrongParameterException(char* message): exception(message) {};
        virtual ~WrongParameterException() throw() {};
}; 

#endif

当我尝试编译它时,编译器给我这个错误:

WrongParameterException.h: In constructor ‘WrongParameterException::WrongParameterException(char*)’:
WrongParameterException.h:14: error: no matching function for call to ‘std::exception::exception(char*&)’
/usr/include/c++/4.3/exception:59: note: candidates are: std::exception::exception()
/usr/include/c++/4.3/exception:57: note: std::exception::exception(const std::exception&)

谁能告诉我我做错了什么?我尝试将消息变量更改为stringconst string,const string&但它没有帮助.

以下是我如何使用我从main创建的新异常:

try
{
     if ((strToInt1 == -1) || (parameters[1] == NULL) || (strToInt3 == -1) || (parameters[3] != NULL))
     {
          throw WrongParameterException("Error in the config or commands file");
     }
}
catch(WrongParameterException e)
{
     log.addMsg(e.what());
}

X-Istence.. 19

首先,#pragma once是错误的方法,了解标题包括警卫.关于SO的相关问题解释了为什么使用#pragma once它是错误的方法.维基百科解释了如何使用包含守卫,它们具有相同的目的而没有任何缺点.

其次,您使用它不知道的参数调用std :: exception的构造函数,在本例中是指向字符数组的指针.

#include 
#include 

class WrongParameterException : public std::runtime_error {
public:
    WrongParameterException(const std::string& message) 
        : std::runtime_error(message) { };
};

可能是你想要的.有关异常的更多信息,请查看C++ FAQ Lite关于异常的文章和cplusplus.com 上的例外文章.

祝好运!



1> X-Istence..:

首先,#pragma once是错误的方法,了解标题包括警卫.关于SO的相关问题解释了为什么使用#pragma once它是错误的方法.维基百科解释了如何使用包含守卫,它们具有相同的目的而没有任何缺点.

其次,您使用它不知道的参数调用std :: exception的构造函数,在本例中是指向字符数组的指针.

#include 
#include 

class WrongParameterException : public std::runtime_error {
public:
    WrongParameterException(const std::string& message) 
        : std::runtime_error(message) { };
};

可能是你想要的.有关异常的更多信息,请查看C++ FAQ Lite关于异常的文章和cplusplus.com 上的例外文章.

祝好运!


我非常确定#pragma曾经有一个gcc版本支持,这个版本是写这篇评论时的最新版本.如果没有,现在支持它 - http://gcc.gnu.org/onlinedocs/gcc-4.6.2/cpp/Alternatives-to-Wrapper-_0023ifndef.html
`#pragma once` [得到广泛支持](http://en.wikipedia.org/wiki/Pragma_once#Portability).此外,我的古老企业环境使用GCC 3.4.2,并且每次测试都支持`#pragma once`.

2> Timbo..:

std :: exception没有构造函数,它接受任何类型的字符串,只有一个返回异常描述的虚拟what()方法.

您必须自己存储字符串并从那里返回.



3> Diego Sevill..:

我的建议是:

    继承自std::runtime_error.正如上面的X-Istence所建议的那样.它在概念上是一个运行时错误,并且std::runtime_error构造函数也接受std::string描述发生的事件的as参数.

    关于你捕捉异常.我使用catch(WrongParameterException const& e) (注意const引用)而不是catch(WrongParameterException e),因为首先,异常在你的情况下通常是常量,并且,使用引用,你捕获任何子类,WrongParameterException以防你的代码进化得更精细的异常处理.



4> unwind..:

std :: exception的构造函数不接受字符串参数.你试图给它一个,这是导致编译错误的原因.

您需要存储您的字符串,最好将其作为std :: string而不是原始指针进行处理,并从what()方法中返回它.

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有