text: /*
   * 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.
   */
  
  #pragma once
  
  #ifndef GEODE_EXCEPTION_H_
  #define GEODE_EXCEPTION_H_
  
  #include <stdexcept>
  #include <string>
  #include <unordered_map>
  
  #include "internal/functional.hpp"
  #include "internal/geode_globals.hpp"
  
  namespace apache {
  namespace geode {
  namespace client {
  
  class StackTrace;
  
  // Ignore C4275 - This class extends std C++ class
  #pragma warning(push)
  #pragma warning(disable : 4275)
  
  /**
   * A description of an exception that occurred during a cache operation.
   */
  class APACHE_GEODE_EXPORT Exception : public std::exception {
   public:
    explicit Exception(const std::string& message);
    explicit Exception(std::string&& message);
    explicit Exception(const char* message);
    Exception(const Exception&) = default;
    Exception& operator=(const Exception&) = default;
    Exception(Exception&&) noexcept = default;
    Exception& operator=(Exception&&) = default;
    ~Exception() noexcept override;
  
    /**
     * Get a stacktrace string from the location the exception was created.
     */
    virtual std::string getStackTrace() const;
  
    /**
     * Return the name of this exception type.
     * */
    virtual std::string getName() const;
  
    /**
     * Get a message with details regarding this exception."
     */
    virtual const std::string& getMessage() const noexcept;
  
    const char* what() const noexcept override;
  
   private:
    std::string message_;
    std::shared_ptr<StackTrace> stack_;
  };
  
  #pragma warning(pop)
  
  }  // namespace client
  }  // namespace geode
  }  // namespace apache
  
  #endif  // GEODE_EXCEPTION_H_
  