diff --git a/vpd_exceptions.hpp b/vpd_exceptions.hpp
new file mode 100644
index 0000000..35c05d4
--- /dev/null
+++ b/vpd_exceptions.hpp
@@ -0,0 +1,135 @@
+#pragma once
+
+#include <stdexcept>
+
+namespace openpower
+{
+namespace vpd
+{
+namespace exceptions
+{
+
+/** @class VPDException
+ * @brief This class inherits std::runtime_error and overrrides
+ * "what" method to return the description of exception.
+ * This class also works as base class for custom exception
+ * classes of openpower-vpd repository.
+ */
+class VPDException : public std::runtime_error
+{
+  public:
+    // deleted methods
+    VPDException() = delete;
+    VPDException(const VPDException&) = delete;
+    VPDException(VPDException&&) = delete;
+    VPDException& operator=(const VPDException&) = delete;
+
+    // default destructor
+    ~VPDException() = default;
+
+    /** @brief constructor
+     *  @param[in] - string to define exception
+     */
+    explicit VPDException(const std::string& msg) :
+        std::runtime_error(msg), errMsg(msg)
+    {
+    }
+
+    /** @brief inline method to return exception string
+     * This is overridden method of std::runtime class
+     */
+    inline const char* what() const noexcept override
+    {
+        return errMsg.c_str();
+    }
+
+  private:
+    /** @brief string to hold the reason of exception */
+    std::string errMsg;
+
+}; // class VPDException
+
+/** @class VpdEccException
+ *  @brief This class extends Exceptions class and define
+ *  type for ECC related exception in VPD
+ */
+class VpdEccException : public VPDException
+{
+  public:
+    // deleted methods
+    VpdEccException() = delete;
+    VpdEccException(const VpdEccException&) = delete;
+    VpdEccException(VpdEccException&&) = delete;
+    VpdEccException& operator=(const VpdEccException&) = delete;
+
+    // default destructor
+    ~VpdEccException() = default;
+
+    /** @brief constructor
+     *  @param[in] - string to define exception
+     */
+    explicit VpdEccException(const std::string& msg) : VPDException(msg)
+    {
+    }
+
+}; // class VpdEccException
+
+/** @class VpdDataException
+ *  @brief This class extends Exceptions class and define
+ *  type for data related exception in VPD
+ */
+class VpdDataException : public VPDException
+{
+  public:
+    // deleted methods
+    VpdDataException() = delete;
+    VpdDataException(const VpdDataException&) = delete;
+    VpdDataException(VpdDataException&&) = delete;
+    VpdDataException& operator=(const VpdDataException&) = delete;
+
+    // default destructor
+    ~VpdDataException() = default;
+
+    /** @brief constructor
+     *  @param[in] - string to define exception
+     */
+    explicit VpdDataException(const std::string& msg) : VPDException(msg)
+    {
+    }
+
+}; // class VpdDataException
+
+class VpdJsonException : public VPDException
+{
+  public:
+    // deleted methods
+    VpdJsonException() = delete;
+    VpdJsonException(const VpdJsonException&) = delete;
+    VpdJsonException(VpdDataException&&) = delete;
+    VpdJsonException& operator=(const VpdDataException&) = delete;
+
+    // default destructor
+    ~VpdJsonException() = default;
+
+    /** @brief constructor
+     *  @param[in] - string to define exception
+     */
+    explicit VpdJsonException(const std::string& msg, const std::string& Path) :
+        VPDException(msg), jsonPath(Path)
+    {
+    }
+
+    inline std::string getJsonPath() const
+    {
+        return jsonPath;
+    }
+
+  private:
+    /** To hold the path of Json that failed to parse*/
+    std::string jsonPath;
+
+}; // class VpdJSonException
+
+} // namespace exceptions
+} // namespace vpd
+} // namespace openpower
\ No newline at end of file
