create commands collection and c++ linux exception ubuntu

c++ - commands - mongodb create db command line



Crear nueva excepción en C++ (6)

El constructor std :: exception no toma un argumento de cadena. Está intentando darle uno, que es lo que causa el error de compilación.

Necesita almacenar su cadena, que sería mejor manejar como std :: cadena en lugar de un puntero sin formato, y devolverla desde el método what() .

Tengo una clase C ++ y estoy tratando de ejecutarlo en Ubuntu:

#ifndef WRONGPARAMETEREXCEPTION_H_ #define WRONGPARAMETEREXCEPTION_H_ #include <iostream> #include <exception> #include <string> using namespace std; #pragma once class WrongParameterException: public exception { public: WrongParameterException(char* message): exception(message) {}; virtual ~WrongParameterException() throw() {}; }; #endif

cuando intento compilarlo, el compilador me da este error:

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&)

¿Alguien puede decirme qué estoy haciendo mal? Traté de cambiar la variable del mensaje a string o const string o const string& pero no ayudó.

Aquí es cómo uso la nueva excepción que creé desde 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()); }


Una solución simple es diseñar su excepción de manera diferente. Aquí hay un ejemplo simple:

class MyException : public Exception { public: MyException(CString strError) { m_strError = strError; } CString m_strError; };

Entonces, simplemente puede usar su mensaje de excepción como lo desee. Esto se debe a que Exception no tiene un contructor que exceptúe un String, por lo que debe restringirlo por su cuenta.


std :: exception no tiene un constructor que tome ningún tipo de cadena, solo un método virtual what () que devuelve la descripción de la excepción.

Tendrá que guardar la cadena usted mismo y devolverla desde allí.


En cuanto a la declaración de la clase de excepción en MS VS2K5, el constructor que desea es:

exception (const char *const&);

así que intente cambiar su constructor a:

WrongParameterException (const char *const message)

y ver si eso ayuda. De lo contrario, guarde el puntero en su propia clase e implemente todos los métodos relevantes.


Mi consejo sería:

  1. Heredar de std::runtime_error . Según lo recomendado por X-Istence arriba. Conceptualmente es un error de tiempo de ejecución, y el constructor std::runtime_error acepta una std::string como argumento que describe lo que sucedió.
  2. Sobre su captura de la excepción. Utilizaría catch(WrongParameterException const& e) (observe la referencia const) en lugar de catch(WrongParameterException e) , porque primero, la excepción es normalmente constante en su caso, y, también, usando la referencia, atrapa cualquier subclase de WrongParameterException en caso de que su código evolucione con un manejo de excepciones más refinado.

En primer lugar, #pragma once es la forma incorrecta de hacerlo, aprende sobre los guardias de inclusión de encabezado. La pregunta relacionada sobre SO explica por qué usar #pragma once es la forma incorrecta de hacerlo. Wikipedia explica cómo usar incluir guardias que sirven para el mismo propósito sin ninguno de los inconvenientes.

En segundo lugar, llama al constructor de std :: exception con un parámetro que desconoce, en este caso un puntero a una matriz de caracteres.

#include <stdexcept> #include <string> class WrongParameterException : public std::runtime_error { public: WrongParameterException(const std::string& message) : std::runtime_error(message) { }; };

Probablemente sea lo que quieras. Para obtener más información sobre excepciones, consulte el artículo de C ++ FAQ Lite en Excepciones y el artículo de excepciones en cplusplus.com.

¡Buena suerte!