view mde/exception.d @ 179:1f9d00f392bd default tip

Fixed a bug where (non-resizible) widgets wouldn't get shrunk when minimal size decreases, meaning optional context menus are hiden properly now. Optimised when ServiceContentList.opCall is called, I think without breaking anything.
author Diggory Hardy <diggory.hardy@gmail.com>
date Tue, 15 Sep 2009 20:09:59 +0200
parents 9f035cd139c6
children
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 ContentException : mdeException {
    char[] getSymbol () {
        return super.getSymbol ~ ".content";
    }
    
    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 ContentException("");
        assert (mE.getSymbol() == "mde.content", 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.");
    }
}