/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ /** * \file PerftoolError.cpp */ #include "tests/storePerftools/common/PerftoolError.h" #include // std::setfill(), std::setw() namespace tests { namespace storePerftools { namespace common { // private PerftoolError::PerftoolError() : std::runtime_error(std::string()) {} PerftoolError::PerftoolError(const uint32_t errCode) throw () : std::runtime_error(std::string()), m_errCode(errCode) { formatWhatStr(); } PerftoolError::PerftoolError(const std::string& errMsg) throw () : std::runtime_error(std::string()), m_errCode(0), m_errMsg(errMsg) { formatWhatStr(); } PerftoolError::PerftoolError(const uint32_t errCode, const std::string& errMsg) throw () : std::runtime_error(std::string()), m_errCode(errCode), m_errMsg(errMsg) { formatWhatStr(); } PerftoolError::PerftoolError(const uint32_t errCode, const std::string& throwingClass, const std::string& throwingFunction) throw () : std::runtime_error(std::string()), m_errCode(errCode), m_throwingClass(throwingClass), m_throwingFunction(throwingFunction) { formatWhatStr(); } PerftoolError::PerftoolError(const std::string& errMsg, const std::string& throwingClass, const std::string& throwingFunction) throw () : std::runtime_error(std::string()), m_errCode(0), m_errMsg(errMsg), m_throwingClass(throwingClass), m_throwingFunction(throwingFunction) { formatWhatStr(); } PerftoolError::PerftoolError(const uint32_t errCode, const std::string& errMsg, const std::string& throwingClass, const std::string& throwingFunction) throw () : std::runtime_error(std::string()), m_errCode(errCode), m_errMsg(errMsg), m_throwingClass(throwingClass), m_throwingFunction(throwingFunction) {} PerftoolError::~PerftoolError() throw() {} const char* PerftoolError::what() const throw () { return m_what.c_str(); } uint32_t PerftoolError::getErrorCode() const throw () { return m_errCode; } const std::string PerftoolError::getAdditionalInfo() const throw () { return m_errMsg; } const std::string PerftoolError::getThrowingClass() const throw () { return m_throwingClass; } const std::string PerftoolError::getThrowingFunction() const throw () { return m_throwingFunction; } void PerftoolError::toStream(std::ostream& os) const { os << what(); } // private void PerftoolError::formatWhatStr() throw () { try { const bool ai = !m_errMsg.empty(); const bool tc = !m_throwingClass.empty(); const bool tf = !m_throwingFunction.empty(); std::ostringstream oss; oss << className() << " 0x" << std::hex << std::setfill('0') << std::setw(4) << m_errCode << " "; if (tc) { oss << m_throwingClass; if (tf) { oss << "::"; } else { oss << " "; } } if (tf) { oss << m_throwingFunction << "() "; } if (tc || tf) { oss << "threw " << s_errorMessage(m_errCode); } if (ai) { oss << " (" << m_errMsg << ")"; } m_what.assign(oss.str()); } catch (...) {} } // private const char* PerftoolError::className() { return s_className; } // private static const char* PerftoolError::s_className = "PerftoolError"; // --- Static definitions --- PerftoolError::errorMap_t PerftoolError::s_errorMap; PerftoolError::errorMapCitr_t PerftoolError::s_errorMapIterator; bool PerftoolError::s_initializedFlag = PerftoolError::s_initialize(); // --- Generic and system errors --- const uint32_t PerftoolError::PERR_PTHREAD = 0x0001; // static const char* PerftoolError::s_errorMessage(const uint32_t err_no) throw () { s_errorMapIterator = s_errorMap.find(err_no); if (s_errorMapIterator == s_errorMap.end()) return ""; return s_errorMapIterator->second; } // private static bool PerftoolError::s_initialize() { s_errorMap[PERR_PTHREAD] = "ERR_PTHREAD: pthread operation failure"; return true; } }}} // namespace tests::storePerftools::common