view mde/exception.d @ 26:611f7b9063c6

Changed the licensing and removed a few dead files. Changed licensing to "GPL version 2 or later" to avoid future compatibility issues. Also a unittest fix to the previous commit. committer: Diggory Hardy <diggory.hardy@gmail.com>
author Diggory Hardy <diggory.hardy@gmail.com>
date Thu, 03 Apr 2008 18:15:02 +0100
parents 2c28ee04a4ed
children f985c28c0ec9
line wrap: on
line source

/* LICENSE BLOCK
Part of mde: a Modular D game-oriented Engine
Copyright © 2007-2008 Diggory Hardy

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, see <http://www.gnu.org/licenses/>. */

/// Contains the base class for all mde exceptions plus some exception classes.
module mde.exception;

/** Base class for all mde Exceptions.
 *
 * All packages should have their own base exception type extending this one, and for each package
 * level a CTOR taking a message should pass the message to the super.
 * A CTOR not taking a message and calling the super without a parameter may also be provided.
 *
 * The static string symbol
 * should be overriden as below so that it ends up as something like "mde.file" or
 * "mde.pkg.file.Class" describing where the exception was thrown. (Since only methods overload
 * correctly, symbol is made static and an overloadable method is used to access the correct symbol.)
 */
 class mdeException : Exception {
     /// Override in derived classes to name the module where the error occured.
    char[] getSymbol () {
        return "mde";
    }
    /// Prefix msg, e.g.: "mde.foo: message"
    char[] prefixedMsg () {
        return getSymbol() ~ ": " ~ msg;
    }
    this (char[] msg) {
        super(msg);
    }
    this () {			// No supplied error message.
        super("");
    }
}

/// Thrown when loading options fails.
class optionsLoadException : mdeException {
    char[] getSymbol () {
        return super.getSymbol ~ ".options";
    }
    
    this (char[] msg) {
        super(msg);
    }
}

/// Thrown when loading strings for the requested name and current locale fails.
class L10nLoadException : mdeException {
    char[] getSymbol () {
        return super.getSymbol ~ ".i18n.I18nTranslation";
    }
    
    this (char[] msg) {
        super(msg);
    }
}

debug (mdeUnitTest) {
    import tango.util.log.Log : Log, Logger;

    private Logger logger;
    static this() {
        logger = Log.getLogger ("mde.exception");
    }
    
    unittest {
        // Check message prepending works correctly.
        mdeException mE = new optionsLoadException("");
        assert (mE.getSymbol() == "mde.options", mE.getSymbol());
        try {
            throw new mdeException ("ABC");
            assert (false);
        } catch (mdeException e) {
            assert (e.msg == "ABC", e.msg);
            assert (e.prefixedMsg == "mde: ABC", e.prefixedMsg);
        }
    
        logger.info ("Unittest complete.");
    }
}