mirror of
https://github.com/amyinspace/MagicSetEditor2.git
synced 2026-06-10 04:57:00 -04:00
c6a74d4576
git-svn-id: svn://svn.code.sf.net/p/magicseteditor/code/trunk@1642 0fc631ac-6414-0410-93d0-97cfa31319b6
184 lines
5.8 KiB
C++
184 lines
5.8 KiB
C++
//+----------------------------------------------------------------------------+
|
|
//| Description: Magic Set Editor - Program to make Magic (tm) cards |
|
|
//| Copyright: (C) 2001 - 2010 Twan van Laarhoven and Sean Hunt |
|
|
//| License: GNU General Public License 2 or later (see file COPYING) |
|
|
//+----------------------------------------------------------------------------+
|
|
|
|
#ifndef HEADER_UTIL_ERROR
|
|
#define HEADER_UTIL_ERROR
|
|
|
|
/** @file util/error.hpp
|
|
*
|
|
* @brief Classes and functions for handling errors/exceptions.
|
|
*/
|
|
|
|
// ----------------------------------------------------------------------------- : Includes
|
|
|
|
#include <util/prec.hpp>
|
|
|
|
// ----------------------------------------------------------------------------- : Error types
|
|
|
|
/// Our own exception class
|
|
class Error {
|
|
public:
|
|
Error(const String& message);
|
|
virtual ~Error();
|
|
|
|
/// Return the error message
|
|
virtual String what() const;
|
|
/// Is the message (potentially) fatal?
|
|
virtual bool is_fatal() const { return false; }
|
|
|
|
protected:
|
|
String message; ///< The error message
|
|
};
|
|
|
|
|
|
/// Internal errors
|
|
class InternalError : public Error {
|
|
public:
|
|
InternalError(const String& str);
|
|
// not all internal errors are fatal, but we had still better warn the user about them.
|
|
virtual bool is_fatal() const { return true; }
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------- : File errors
|
|
|
|
/// Errors related to packages
|
|
class PackageError : public Error {
|
|
public:
|
|
inline PackageError(const String& str) : Error(str) {}
|
|
};
|
|
|
|
/// A package is not found
|
|
class PackageNotFoundError : public PackageError {
|
|
public:
|
|
inline PackageNotFoundError(const String& str) : PackageError(str) {}
|
|
};
|
|
|
|
/// A file is not found
|
|
class FileNotFoundError : public PackageError {
|
|
public:
|
|
inline FileNotFoundError(const String& file, const String& package)
|
|
: PackageError(_ERROR_2_("file not found", file, package))
|
|
{}
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------- : Parse errors
|
|
|
|
/// Parse errors
|
|
class ParseError : public Error {
|
|
public:
|
|
inline ParseError(const String& str) : Error(str) {}
|
|
};
|
|
|
|
/// Parse error in a particular file
|
|
class FileParseError : public ParseError {
|
|
public:
|
|
inline FileParseError(const String& err, const String& file) :
|
|
ParseError(_ERROR_2_("file parse error", file, err))
|
|
{}
|
|
};
|
|
|
|
/// Parse error in a script
|
|
class ScriptParseError : public ParseError {
|
|
public:
|
|
ScriptParseError(size_t pos, int line, const String& filename, const String& str);
|
|
ScriptParseError(size_t pos, int line, const String& filename, const String& expected, const String& found);
|
|
ScriptParseError(size_t pos1, size_t pos2, int line, const String& filename, const String& open, const String& close, const String& found);
|
|
/// Position of the error
|
|
size_t start, end;
|
|
/// Line number of the error (the first line is 1)
|
|
int line;
|
|
/// Filename the error was in, or an empty string
|
|
String filename;
|
|
/// Return the error message
|
|
virtual String what() const;
|
|
};
|
|
|
|
/// Multiple parse errors in a script
|
|
class ScriptParseErrors : public ParseError {
|
|
public:
|
|
ScriptParseErrors(const vector<ScriptParseError>& errors);
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------- : Script errors
|
|
|
|
/// A runtime error in a script
|
|
class ScriptError : public Error {
|
|
public:
|
|
inline ScriptError(const String& str) : Error(str) {}
|
|
};
|
|
|
|
/// "Variable not set"
|
|
class ScriptErrorNoVariable : public ScriptError {
|
|
public:
|
|
inline ScriptErrorNoVariable(const String& var) : ScriptError(_("Variable not set: ") + var) {}
|
|
};
|
|
|
|
/// "Can't convert from A to B"
|
|
class ScriptErrorConversion : public ScriptError {
|
|
public:
|
|
inline ScriptErrorConversion(const String& a, const String& b)
|
|
: ScriptError(_ERROR_2_("can't convert", a, b)) {}
|
|
inline ScriptErrorConversion(const String& value, const String& a, const String& b)
|
|
: ScriptError(_ERROR_3_("can't convert value", value, a, b)) {}
|
|
};
|
|
|
|
/// "A has no member B"
|
|
class ScriptErrorNoMember : public ScriptError {
|
|
public:
|
|
inline ScriptErrorNoMember(const String& type, const String& member)
|
|
: ScriptError(_ERROR_2_("has no member", type, member)) {}
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------- : Error/message handling
|
|
|
|
/// Should a popup be shown for internal errors?
|
|
extern bool show_message_box_for_fatal_errors;
|
|
extern bool write_errors_to_cli;
|
|
|
|
/// Types/levels of (error)messages
|
|
enum MessageType
|
|
{ MESSAGE_INPUT
|
|
, MESSAGE_OUTPUT
|
|
, MESSAGE_INFO
|
|
, MESSAGE_WARNING
|
|
, MESSAGE_ERROR
|
|
, MESSAGE_FATAL_ERROR
|
|
|
|
, MESSAGE_TYPE_MAX
|
|
};
|
|
|
|
/// Queue an (error) message, it can later be retrieved with get_queued_message
|
|
/** If the message is a MESSAGE_FATAL_ERROR, and show_message_box_for_fatal_errors==true, then a popup is shown
|
|
*/
|
|
void queue_message(MessageType type, String const& msg);
|
|
/// Handle an error by queuing a message
|
|
void handle_error(const Error& e);
|
|
|
|
/// Are there any queued messages?
|
|
bool have_queued_message();
|
|
|
|
/// Get the first queued message, or return false
|
|
bool get_queued_message(MessageType& type, String& msg);
|
|
|
|
|
|
/// Make a stack trace for use in InternalErrors
|
|
String get_stack_trace();
|
|
|
|
/// Catch all types of errors, and pass then to handle_error
|
|
#define CATCH_ALL_ERRORS(handle_now) \
|
|
catch (const Error& e) { \
|
|
handle_error(e); \
|
|
} catch (const std::exception& e) { \
|
|
/* we don't throw std::exception ourselfs, so this is probably something serious */ \
|
|
String message(e.what(), IF_UNICODE(wxConvLocal, wxSTRING_MAXLEN) ); \
|
|
handle_error(InternalError(message)); \
|
|
} catch (...) { \
|
|
handle_error(InternalError(_("An unexpected exception occurred!"))); \
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------- : EOF
|
|
#endif
|