X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Fexceptions.h;h=213be6186d523a713a0a3f167f77127e0047164e;hp=b04d973dc7a62197571ce7d6697917f2023b23e0;hb=854f2e5bbb7ffb9758b823af87034033033f3cb8;hpb=089b90439e745a218494e76b45e7df6215af01df diff --git a/src/lib/exceptions.h b/src/lib/exceptions.h index b04d973dc..213be6186 100644 --- a/src/lib/exceptions.h +++ b/src/lib/exceptions.h @@ -104,7 +104,14 @@ private: /** name of the file that this exception concerns */ boost::filesystem::path _file; }; - + +class JoinError : public StringError +{ +public: + JoinError (std::string s) + : StringError (s) + {} +}; /** @class OpenFileError. * @brief Indicates that some error occurred when trying to open a file. @@ -223,17 +230,38 @@ public: PixelFormatError (std::string o, AVPixelFormat f); }; +/** An error that occurs while parsing a SubRip file */ +class SubRipError : public FileError +{ +public: + SubRipError (std::string, std::string, boost::filesystem::path); +}; + +/** A parent class for classes which have a need to catch and + * re-throw exceptions. This is intended for classes + * which run their own thread; they should do something like + * + * void my_thread () + * try { + * // do things which might throw exceptions + * } catch (...) { + * store_current (); + * } + * + * and then in another thread call rethrow(). If any + * exception was thrown by my_thread it will be stored by + * store_current() and then rethrow() will re-throw it where + * it can be handled. + */ class ExceptionStore { public: - bool thrown () const { - boost::mutex::scoped_lock lm (_mutex); - return _exception; - } - void rethrow () { boost::mutex::scoped_lock lm (_mutex); - boost::rethrow_exception (_exception); + if (_exception) { + boost::rethrow_exception (_exception); + _exception = boost::exception_ptr (); + } } protected: