/*
    Copyright (C) 2018-2019 SKALE Labs

    This file is part of skale-consensus.

    skale-consensus is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as published
    by the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    skale-consensus 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 Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with skale-consensus.  If not, see <https://www.gnu.org/licenses/>.

    @file Exception.h
    @author Stan Kladko
    @date 2018
*/

#pragma once


class Exception : public std::exception {
public:
    Exception( const std::string& _message, const std::string& _className ) {
        message = _className + ":" + _message;
    }
    const char* what() const noexcept override {
        return message.empty() ? std::exception::what() : message.c_str();
    }

    const std::string& getMessage() const { return message; }

    bool isFatal() const { return fatal; }

private:
    std::string message;

protected:
    bool fatal = false;

public:
    static void logNested( const std::exception& e, int level = 0 );
};