diff options
| author | Mike Buland <mike@xagasoft.com> | 2022-03-31 23:52:06 -0700 |
|---|---|---|
| committer | Mike Buland <mike@xagasoft.com> | 2022-03-31 23:52:06 -0700 |
| commit | 58fa55cf44c8b87ae3edb8f24fbac128649a7255 (patch) | |
| tree | 5e879a71edffc7dcabb242dece0212723d90c64d | |
| parent | bee0b9c862d5eb325b8c29767a89b3d895b5f5a9 (diff) | |
| download | libgats-58fa55cf44c8b87ae3edb8f24fbac128649a7255.tar.gz libgats-58fa55cf44c8b87ae3edb8f24fbac128649a7255.tar.bz2 libgats-58fa55cf44c8b87ae3edb8f24fbac128649a7255.tar.xz libgats-58fa55cf44c8b87ae3edb8f24fbac128649a7255.zip | |
Added real exceptions based on QException.
These may not be stl compatible, which would be sad. They seem to work
in practice, though.
Diffstat (limited to '')
| -rw-r--r-- | c++-qt/gats-qt/parseexception.h | 25 | ||||
| -rw-r--r-- | c++-qt/gats-qt/typeexception.h | 26 | ||||
| -rw-r--r-- | c++-qt/src/dictionary.cpp | 31 | ||||
| -rw-r--r-- | c++-qt/src/object.cpp | 4 | ||||
| -rw-r--r-- | c++-qt/src/parseexception.cpp | 31 | ||||
| -rw-r--r-- | c++-qt/src/typeexception.cpp | 32 |
6 files changed, 134 insertions, 15 deletions
diff --git a/c++-qt/gats-qt/parseexception.h b/c++-qt/gats-qt/parseexception.h new file mode 100644 index 0000000..24b26ae --- /dev/null +++ b/c++-qt/gats-qt/parseexception.h | |||
| @@ -0,0 +1,25 @@ | |||
| 1 | #ifndef GATS_PARSE_EXCEPTION_H | ||
| 2 | #define GATS_PARSE_EXCEPTION_H | ||
| 3 | |||
| 4 | #include <QException> | ||
| 5 | |||
| 6 | namespace Gats | ||
| 7 | { | ||
| 8 | class ParseException : public QException | ||
| 9 | { | ||
| 10 | public: | ||
| 11 | ParseException( const char * const sMessage ); | ||
| 12 | ParseException( const ParseException &rSrc ); | ||
| 13 | virtual ~ParseException(); | ||
| 14 | |||
| 15 | virtual QException *clone() const; | ||
| 16 | virtual void raise() const; | ||
| 17 | |||
| 18 | virtual const char *what() const noexcept; | ||
| 19 | |||
| 20 | private: | ||
| 21 | const char *sMessage; | ||
| 22 | }; | ||
| 23 | }; | ||
| 24 | |||
| 25 | #endif | ||
diff --git a/c++-qt/gats-qt/typeexception.h b/c++-qt/gats-qt/typeexception.h new file mode 100644 index 0000000..93d00ba --- /dev/null +++ b/c++-qt/gats-qt/typeexception.h | |||
| @@ -0,0 +1,26 @@ | |||
| 1 | #ifndef GATS_TYPE_EXCEPTION_H | ||
| 2 | #define GATS_TYPE_EXCEPTION_H | ||
| 3 | |||
| 4 | #include <QException> | ||
| 5 | |||
| 6 | namespace Gats | ||
| 7 | { | ||
| 8 | class TypeException : public QException | ||
| 9 | { | ||
| 10 | public: | ||
| 11 | TypeException( const char * const sMessage ); | ||
| 12 | TypeException( const TypeException &rSrc ); | ||
| 13 | virtual ~TypeException(); | ||
| 14 | |||
| 15 | virtual QException *clone() const; | ||
| 16 | virtual void raise() const; | ||
| 17 | |||
| 18 | virtual const char *what() const noexcept; | ||
| 19 | |||
| 20 | private: | ||
| 21 | const char *sMessage; | ||
| 22 | }; | ||
| 23 | }; | ||
| 24 | |||
| 25 | #endif | ||
| 26 | |||
diff --git a/c++-qt/src/dictionary.cpp b/c++-qt/src/dictionary.cpp index 9b528f1..10ec6c5 100644 --- a/c++-qt/src/dictionary.cpp +++ b/c++-qt/src/dictionary.cpp | |||
| @@ -13,6 +13,9 @@ | |||
| 13 | #include "gats-qt/string.h" | 13 | #include "gats-qt/string.h" |
| 14 | #include "gats-qt/list.h" | 14 | #include "gats-qt/list.h" |
| 15 | 15 | ||
| 16 | #include "gats-qt/parseexception.h" | ||
| 17 | #include "gats-qt/typeexception.h" | ||
| 18 | |||
| 16 | Gats::Dictionary::Dictionary() | 19 | Gats::Dictionary::Dictionary() |
| 17 | { | 20 | { |
| 18 | } | 21 | } |
| @@ -51,7 +54,7 @@ void Gats::Dictionary::write( QIODevice &rOut ) const | |||
| 51 | rOut.write("e", 1 ); | 54 | rOut.write("e", 1 ); |
| 52 | } | 55 | } |
| 53 | 56 | ||
| 54 | void Gats::Dictionary::read( QIODevice &rIn, char cType ) | 57 | void Gats::Dictionary::read( QIODevice &rIn, char /*cType*/ ) |
| 55 | { | 58 | { |
| 56 | for(;;) | 59 | for(;;) |
| 57 | { | 60 | { |
| @@ -60,7 +63,7 @@ void Gats::Dictionary::read( QIODevice &rIn, char cType ) | |||
| 60 | if( cNext == 'e' ) | 63 | if( cNext == 'e' ) |
| 61 | break; | 64 | break; |
| 62 | if( cNext != 's' ) | 65 | if( cNext != 's' ) |
| 63 | throw "PUT GOOD EXCEPTION HERE"; | 66 | throw ParseException("Bad format reading binary Gats Dictionary."); |
| 64 | Gats::String sKey; | 67 | Gats::String sKey; |
| 65 | sKey.read( rIn, cNext ); | 68 | sKey.read( rIn, cNext ); |
| 66 | 69 | ||
| @@ -243,7 +246,7 @@ bool Gats::Dictionary::valueBool( const QByteArray &sKey ) | |||
| 243 | { | 246 | { |
| 244 | Gats::Boolean *pOb = dynamic_cast<Gats::Boolean *>( value( sKey ) ); | 247 | Gats::Boolean *pOb = dynamic_cast<Gats::Boolean *>( value( sKey ) ); |
| 245 | if( !pOb ) | 248 | if( !pOb ) |
| 246 | throw "PUT GOOD EXCEPTION HERE"; | 249 | throw TypeException("Dictionary value requested as bool but isn't."); |
| 247 | 250 | ||
| 248 | return pOb->getValue(); | 251 | return pOb->getValue(); |
| 249 | } | 252 | } |
| @@ -252,7 +255,7 @@ int64_t Gats::Dictionary::valueInt( const QByteArray &sKey ) | |||
| 252 | { | 255 | { |
| 253 | Gats::Integer *pOb = dynamic_cast<Gats::Integer *>( value( sKey ) ); | 256 | Gats::Integer *pOb = dynamic_cast<Gats::Integer *>( value( sKey ) ); |
| 254 | if( !pOb ) | 257 | if( !pOb ) |
| 255 | throw "PUT GOOD EXCEPTION HERE"; | 258 | throw TypeException("Dictionary value requested as int but isn't."); |
| 256 | 259 | ||
| 257 | return pOb->getValue(); | 260 | return pOb->getValue(); |
| 258 | } | 261 | } |
| @@ -261,7 +264,7 @@ double Gats::Dictionary::valueFloat( const QByteArray &sKey ) | |||
| 261 | { | 264 | { |
| 262 | Gats::Float *pOb = dynamic_cast<Gats::Float *>( value( sKey ) ); | 265 | Gats::Float *pOb = dynamic_cast<Gats::Float *>( value( sKey ) ); |
| 263 | if( !pOb ) | 266 | if( !pOb ) |
| 264 | throw "PUT GOOD EXCEPTION HERE"; | 267 | throw TypeException("Dictionary value requested as float but isn't."); |
| 265 | 268 | ||
| 266 | return pOb->getValue(); | 269 | return pOb->getValue(); |
| 267 | } | 270 | } |
| @@ -270,7 +273,7 @@ QByteArray Gats::Dictionary::valueStr( const QByteArray &sKey ) | |||
| 270 | { | 273 | { |
| 271 | Gats::String *pOb = dynamic_cast<Gats::String *>( value( sKey ) ); | 274 | Gats::String *pOb = dynamic_cast<Gats::String *>( value( sKey ) ); |
| 272 | if( !pOb ) | 275 | if( !pOb ) |
| 273 | throw "PUT GOOD EXCEPTION HERE"; | 276 | throw TypeException("Dictionary value requested as str but isn't."); |
| 274 | 277 | ||
| 275 | return *pOb; | 278 | return *pOb; |
| 276 | } | 279 | } |
| @@ -279,7 +282,7 @@ Gats::List *Gats::Dictionary::valueList( const QByteArray &sKey ) | |||
| 279 | { | 282 | { |
| 280 | Gats::List *pOb = dynamic_cast<Gats::List *>( value( sKey ) ); | 283 | Gats::List *pOb = dynamic_cast<Gats::List *>( value( sKey ) ); |
| 281 | if( !pOb ) | 284 | if( !pOb ) |
| 282 | throw "PUT GOOD EXCEPTION HERE"; | 285 | throw TypeException("Dictionary value requested as list but isn't."); |
| 283 | 286 | ||
| 284 | return pOb; | 287 | return pOb; |
| 285 | } | 288 | } |
| @@ -288,7 +291,7 @@ Gats::Dictionary *Gats::Dictionary::valueDict( const QByteArray &sKey ) | |||
| 288 | { | 291 | { |
| 289 | Gats::Dictionary *pOb = dynamic_cast<Gats::Dictionary *>( value( sKey ) ); | 292 | Gats::Dictionary *pOb = dynamic_cast<Gats::Dictionary *>( value( sKey ) ); |
| 290 | if( !pOb ) | 293 | if( !pOb ) |
| 291 | throw "PUT GOOD EXCEPTION HERE"; | 294 | throw TypeException("Dictionary value requested as dict but isn't."); |
| 292 | 295 | ||
| 293 | return pOb; | 296 | return pOb; |
| 294 | } | 297 | } |
| @@ -297,7 +300,7 @@ bool Gats::Dictionary::valueBool( const QByteArray &sKey ) const | |||
| 297 | { | 300 | { |
| 298 | Gats::Boolean *pOb = dynamic_cast<Gats::Boolean *>( value( sKey ) ); | 301 | Gats::Boolean *pOb = dynamic_cast<Gats::Boolean *>( value( sKey ) ); |
| 299 | if( !pOb ) | 302 | if( !pOb ) |
| 300 | throw "PUT GOOD EXCEPTION HERE"; | 303 | throw TypeException("Dictionary value requested as bool but isn't."); |
| 301 | 304 | ||
| 302 | return pOb->getValue(); | 305 | return pOb->getValue(); |
| 303 | } | 306 | } |
| @@ -306,7 +309,7 @@ int64_t Gats::Dictionary::valueInt( const QByteArray &sKey ) const | |||
| 306 | { | 309 | { |
| 307 | Gats::Integer *pOb = dynamic_cast<Gats::Integer *>( value( sKey ) ); | 310 | Gats::Integer *pOb = dynamic_cast<Gats::Integer *>( value( sKey ) ); |
| 308 | if( !pOb ) | 311 | if( !pOb ) |
| 309 | throw "PUT GOOD EXCEPTION HERE"; | 312 | throw TypeException("Dictionary value requested as int but isn't."); |
| 310 | 313 | ||
| 311 | return pOb->getValue(); | 314 | return pOb->getValue(); |
| 312 | } | 315 | } |
| @@ -315,7 +318,7 @@ double Gats::Dictionary::valueFloat( const QByteArray &sKey ) const | |||
| 315 | { | 318 | { |
| 316 | Gats::Float *pOb = dynamic_cast<Gats::Float *>( value( sKey ) ); | 319 | Gats::Float *pOb = dynamic_cast<Gats::Float *>( value( sKey ) ); |
| 317 | if( !pOb ) | 320 | if( !pOb ) |
| 318 | throw "PUT GOOD EXCEPTION HERE"; | 321 | throw TypeException("Dictionary value requested as float but isn't."); |
| 319 | 322 | ||
| 320 | return pOb->getValue(); | 323 | return pOb->getValue(); |
| 321 | } | 324 | } |
| @@ -324,7 +327,7 @@ QByteArray Gats::Dictionary::valueStr( const QByteArray &sKey ) const | |||
| 324 | { | 327 | { |
| 325 | Gats::String *pOb = dynamic_cast<Gats::String *>( value( sKey ) ); | 328 | Gats::String *pOb = dynamic_cast<Gats::String *>( value( sKey ) ); |
| 326 | if( !pOb ) | 329 | if( !pOb ) |
| 327 | throw "PUT GOOD EXCEPTION HERE"; | 330 | throw TypeException("Dictionary value requested as str but isn't."); |
| 328 | 331 | ||
| 329 | return *pOb; | 332 | return *pOb; |
| 330 | } | 333 | } |
| @@ -333,7 +336,7 @@ Gats::List *Gats::Dictionary::valueList( const QByteArray &sKey ) const | |||
| 333 | { | 336 | { |
| 334 | Gats::List *pOb = dynamic_cast<Gats::List *>( value( sKey ) ); | 337 | Gats::List *pOb = dynamic_cast<Gats::List *>( value( sKey ) ); |
| 335 | if( !pOb ) | 338 | if( !pOb ) |
| 336 | throw "PUT GOOD EXCEPTION HERE"; | 339 | throw TypeException("Dictionary value requested as list but isn't."); |
| 337 | 340 | ||
| 338 | return pOb; | 341 | return pOb; |
| 339 | } | 342 | } |
| @@ -342,7 +345,7 @@ Gats::Dictionary *Gats::Dictionary::valueDict( const QByteArray &sKey ) const | |||
| 342 | { | 345 | { |
| 343 | Gats::Dictionary *pOb = dynamic_cast<Gats::Dictionary *>( value( sKey ) ); | 346 | Gats::Dictionary *pOb = dynamic_cast<Gats::Dictionary *>( value( sKey ) ); |
| 344 | if( !pOb ) | 347 | if( !pOb ) |
| 345 | throw "PUT GOOD EXCEPTION HERE"; | 348 | throw TypeException("Dictionary value requested as dict but isn't."); |
| 346 | 349 | ||
| 347 | return pOb; | 350 | return pOb; |
| 348 | } | 351 | } |
diff --git a/c++-qt/src/object.cpp b/c++-qt/src/object.cpp index 85851df..d148774 100644 --- a/c++-qt/src/object.cpp +++ b/c++-qt/src/object.cpp | |||
| @@ -15,6 +15,8 @@ | |||
| 15 | #include "gats-qt/dictionary.h" | 15 | #include "gats-qt/dictionary.h" |
| 16 | #include "gats-qt/null.h" | 16 | #include "gats-qt/null.h" |
| 17 | 17 | ||
| 18 | #include "gats-qt/parseexception.h" | ||
| 19 | |||
| 18 | #include <stdlib.h> | 20 | #include <stdlib.h> |
| 19 | 21 | ||
| 20 | #include <QIODevice> | 22 | #include <QIODevice> |
| @@ -68,7 +70,7 @@ Gats::Object *Gats::Object::read( QIODevice &rIn ) | |||
| 68 | return NULL; | 70 | return NULL; |
| 69 | 71 | ||
| 70 | default: | 72 | default: |
| 71 | throw "Invalid Gats type discovered: "; | 73 | throw ParseException("Invalid Gats type discovered."); |
| 72 | } | 74 | } |
| 73 | 75 | ||
| 74 | pObj->read( rIn, buf ); | 76 | pObj->read( rIn, buf ); |
diff --git a/c++-qt/src/parseexception.cpp b/c++-qt/src/parseexception.cpp new file mode 100644 index 0000000..03d547a --- /dev/null +++ b/c++-qt/src/parseexception.cpp | |||
| @@ -0,0 +1,31 @@ | |||
| 1 | #include "gats-qt/parseexception.h" | ||
| 2 | |||
| 3 | Gats::ParseException::ParseException( const char * const sMessage ) : | ||
| 4 | sMessage( sMessage ) | ||
| 5 | { | ||
| 6 | } | ||
| 7 | |||
| 8 | Gats::ParseException::ParseException( const ParseException &rSrc ) : | ||
| 9 | sMessage( rSrc.sMessage ) | ||
| 10 | { | ||
| 11 | } | ||
| 12 | |||
| 13 | Gats::ParseException::~ParseException() | ||
| 14 | { | ||
| 15 | } | ||
| 16 | |||
| 17 | QException *Gats::ParseException::clone() const | ||
| 18 | { | ||
| 19 | return new ParseException( *this ); | ||
| 20 | } | ||
| 21 | |||
| 22 | void Gats::ParseException::raise() const | ||
| 23 | { | ||
| 24 | throw *this; | ||
| 25 | } | ||
| 26 | |||
| 27 | const char *Gats::ParseException::what() const noexcept | ||
| 28 | { | ||
| 29 | return sMessage; | ||
| 30 | } | ||
| 31 | |||
diff --git a/c++-qt/src/typeexception.cpp b/c++-qt/src/typeexception.cpp new file mode 100644 index 0000000..13ec3de --- /dev/null +++ b/c++-qt/src/typeexception.cpp | |||
| @@ -0,0 +1,32 @@ | |||
| 1 | #include "gats-qt/typeexception.h" | ||
| 2 | |||
| 3 | Gats::TypeException::TypeException( const char * const sMessage ) : | ||
| 4 | sMessage( sMessage ) | ||
| 5 | { | ||
| 6 | } | ||
| 7 | |||
| 8 | Gats::TypeException::TypeException( const TypeException &rSrc ) : | ||
| 9 | sMessage( rSrc.sMessage ) | ||
| 10 | { | ||
| 11 | } | ||
| 12 | |||
| 13 | Gats::TypeException::~TypeException() | ||
| 14 | { | ||
| 15 | } | ||
| 16 | |||
| 17 | QException *Gats::TypeException::clone() const | ||
| 18 | { | ||
| 19 | return new TypeException( *this ); | ||
| 20 | } | ||
| 21 | |||
| 22 | void Gats::TypeException::raise() const | ||
| 23 | { | ||
| 24 | throw *this; | ||
| 25 | } | ||
| 26 | |||
| 27 | const char *Gats::TypeException::what() const noexcept | ||
| 28 | { | ||
| 29 | return sMessage; | ||
| 30 | } | ||
| 31 | |||
| 32 | |||
