improve examples
[elektra-initiative:libelektra.git] / src / bindings / cpp / examples / cpp_example_userexception.cpp
1 /**
2  * @file
3  *
4  * This example explains how to define user defined exception.
5  *
6  * That means that the user can implement their own exceptions,
7  * e.g. potentially derived from their own base class with its
8  * own what() information.
9  * The user could even decide to use another mechanism
10  * instead of what().
11  *
12  * The only requirements are: They must be named exactly like
13  * the original classes and KDBException constructor must take a key
14  * as argument (which has all information like error and warnings).
15  *
16  * It does not matter from which class the exceptions are derived
17  * or which members they have (if they are binary compatible) as
18  * long as they are used everywhere.
19  *
20  * Never use non-binary compatible user exceptions if you do not
21  * use them everywhere where you include any of elektras header
22  * files!
23  */
24 #include <stdexcept>
25
26 class UserException : public std::exception
27 {
28 public:
29         virtual const char* what() const throw()
30         {
31                 return "User Exception";
32         }
33 };
34
35 namespace kdb
36 {
37
38 class Exception : public UserException
39 {
40 public:
41         virtual const char* what() const throw()
42         {
43                 return "User Exception: Exception thrown by Elektra";
44         }
45 };
46
47 class KeyException : public Exception
48 {
49 public:
50         virtual const char* what() const throw()
51         {
52                 return "User Exception: Exception thrown by a Key";
53         }
54 };
55
56 class KeyTypeMismatch: public KeyException
57 {
58 public:
59         virtual const char* what() const throw()
60         {
61                 return "User Exception: Binary or String key mismatch";
62         }
63 };
64
65 class KeyInvalidName : public KeyException
66 {
67 public:
68         virtual const char* what() const throw()
69         {
70                 return "User Exception: Invalid Keyname";
71         }
72 };
73
74 class KeyMetaException : public KeyException
75 {
76 public:
77         virtual const char* what() const throw()
78         {
79                 return "User Exception: Exception thrown by Key Meta Data related Operations";
80         }
81 };
82
83 class KeyNoSuchMeta : public KeyMetaException
84 {
85 public:
86         virtual const char* what() const throw()
87         {
88                 return "User Exception: No such meta data";
89         }
90 };
91
92 class KeyBadMeta : public KeyMetaException
93 {
94 public:
95         virtual const char* what() const throw()
96         {
97                 return "User Exception: Could not convert bad meta data";
98         }
99 };
100
101 }
102
103 #define USER_DEFINED_EXCEPTIONS
104 #include <key.hpp>
105
106 namespace kdb
107 {
108
109 class KDBException : public Exception
110 {
111 public:
112         KDBException (Key key) :
113                 m_key (key)
114         {}
115
116         virtual ~KDBException() throw()
117         {}
118
119         virtual const char* what() const throw()
120         {
121                 return "User Exception: KDB";
122         }
123 private:
124         Key m_key;
125 };
126
127 }
128
129
130 #include <kdb.hpp>
131
132 int main()
133 {
134         kdb::Key k ("abc", KEY_END);
135         kdb::KDB kdb;
136         kdb::KeySet ks;
137         kdb.get(ks, k);
138 }