/* * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2007-2016 SoftPLC Corporation, Dick Hollenbeck * Copyright (C) 2016-2020 KiCad Developers, see AUTHORS.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, you may find one here: * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html * or you may search the http://www.gnu.org website for the version 2 license, * or you may write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef KI_EXCEPTION_H_ #define KI_EXCEPTION_H_ #include /** * @ingroup exception_types * @{ */ /// macro which captures the "call site" values of __FILE_, __FUNCTION__ & __LINE__ #define THROW_IO_ERROR( msg ) throw IO_ERROR( msg, __FILE__, __FUNCTION__, __LINE__ ) /** * Hold a translatable error message and may be used when throwing exceptions containing a * translated error message. */ class KI_PARAM_ERROR // similar to std::invalid_argument for instance { public: /** * Constructor */ KI_PARAM_ERROR( const wxString& aMessage ) { m_message = aMessage; } KI_PARAM_ERROR() {} const wxString What() const { return m_message; } virtual ~KI_PARAM_ERROR() throw () {} private: wxString m_message; }; /** * Hold an error message and may be used when throwing exceptions containing meaningful * error messages. * * @author Dick Hollenbeck */ class IO_ERROR // : std::exception { public: /** * Use macro #THROW_IO_ERROR() to wrap a call to this constructor at the call site. * * @param aProblem is Problem() text. * @param aThrowersFile is the __FILE__ preprocessor macro but generated at the source * file of thrower. * @param aThrowersFunction is the function name at the throw site. * @param aThrowersLineNumber is the source code line number of the throw. */ IO_ERROR( const wxString& aProblem, const char* aThrowersFile, const char* aThrowersFunction, int aThrowersLineNumber ) { init( aProblem, aThrowersFile, aThrowersFunction, aThrowersLineNumber ); } IO_ERROR() {} void init( const wxString& aProblem, const char* aThrowersFile, const char* aThrowersFunction, int aThrowersLineNumber ); virtual const wxString Problem() const; ///< what was the problem? virtual const wxString Where() const; ///< where did the Problem() occur? virtual const wxString What() const; ///< A composite of Problem() and Where() virtual ~IO_ERROR() throw () {} protected: wxString problem; wxString where; }; /** * A filename or source description, a problem input line, a line number, a byte * offset, and an error message which contains the caller's report and his call * site information: CPP source file, function, and line number. * * @author Dick Hollenbeck */ struct PARSE_ERROR : public IO_ERROR { int lineNumber; ///< at which line number, 1 based index. int byteIndex; ///< at which byte offset within the line, 1 based index /// problem line of input [say, from a LINE_READER]. /// this is brought up in original byte format rather than wxString form, incase /// there was a problem with the encoding, in which case converting to wxString is /// not reliable in this context. std::string inputLine; /** * Normally called via the macro #THROW_PARSE_ERROR so that __FILE__, __FUNCTION__, * and __LINE__ can be captured from the call site. */ PARSE_ERROR( const wxString& aProblem, const char* aThrowersFile, const char* aThrowersFunction, int aThrowersLineNumber, const wxString& aSource, const char* aInputLine, int aLineNumber, int aByteIndex ) : IO_ERROR() { init( aProblem, aThrowersFile, aThrowersFunction, aThrowersLineNumber, aSource, aInputLine, aLineNumber, aByteIndex ); } void init( const wxString& aProblem, const char* aThrowersFile, const char* aThrowersFunction, int aThrowersLineNumber, const wxString& aSource, const char* aInputLine, int aLineNumber, int aByteIndex ); ~PARSE_ERROR() throw () {} const wxString ParseProblem() { return parseProblem; } protected: PARSE_ERROR() : IO_ERROR(), lineNumber( 0 ), byteIndex( 0 ) {} protected: wxString parseProblem; }; #define THROW_PARSE_ERROR( aProblem, aSource, aInputLine, aLineNumber, aByteIndex ) \ throw PARSE_ERROR( aProblem, __FILE__, __FUNCTION__, __LINE__, aSource, aInputLine, \ aLineNumber, aByteIndex ) /** * Variant of #PARSE_ERROR indicating that a syntax or related error was likely caused * by a file generated by a newer version of KiCad than this. This can be used to generate * more informative error messages. */ struct FUTURE_FORMAT_ERROR : public PARSE_ERROR { wxString requiredVersion; ///< version or date of KiCad required to open file FUTURE_FORMAT_ERROR( const wxString& aRequiredVersion ); FUTURE_FORMAT_ERROR( const PARSE_ERROR& aParseError, const wxString& aRequiredVersion ); ~FUTURE_FORMAT_ERROR() throw () {} void init( const wxString& aRequiredVersion ); }; /** @} exception_types */ #endif // KI_EXCEPTION_H_