Use std::runtime_error instead of our own StringError as
authorCarl Hetherington <cth@carlh.net>
Mon, 19 Oct 2015 22:30:04 +0000 (23:30 +0100)
committerCarl Hetherington <cth@carlh.net>
Mon, 19 Oct 2015 22:30:04 +0000 (23:30 +0100)
a) it does the same job and
b) its type and what() survive the boundary between the libdcp .so
and the main DCP-o-matic executable.

Before this StringError-derived exceptions caught by DCP-o-matic
were only recognised as std::exceptions (without the what()) message.

I don't know why this happens, but this works around it.

src/certificate_chain.cc
src/exceptions.cc
src/exceptions.h

index c0bfd52f2752057a1dad5d8f5a9dc87239b726e4..b37c07bf41871750be3aa68736c2888abb48dbd3 100644 (file)
@@ -46,6 +46,7 @@
 using std::string;
 using std::ofstream;
 using std::ifstream;
+using std::runtime_error;
 using std::stringstream;
 using namespace dcp;
 
@@ -535,7 +536,7 @@ CertificateChain::add_signature_value (xmlpp::Node* parent, string ns) const
                );
 
        if (signature_context->signKey == 0) {
-               throw StringError ("could not read private key");
+               throw runtime_error ("could not read private key");
        }
 
        /* XXX: set key name to the PEM string: this can't be right! */
index e1eaa52ee476dd33d5a81d4d635f6ba362f137c8..c588696e22968d0cf3e138543b97afb5a7b769fc 100644 (file)
 #include "compose.hpp"
 
 using std::string;
+using std::runtime_error;
 using namespace dcp;
 
 FileError::FileError (string message, boost::filesystem::path filename, int number)
-       : StringError (String::compose ("%1 (%2) (error %3)", message, filename.string(), number))
+       : runtime_error (String::compose ("%1 (%2) (error %3)", message, filename.string(), number))
        , _filename (filename)
        , _number (number)
 {
@@ -36,48 +37,36 @@ FileError::FileError (string message, boost::filesystem::path filename, int numb
 }
 
 UnresolvedRefError::UnresolvedRefError (string id)
-       : StringError (String::compose ("Unresolved reference to asset id %1", id))
+       : runtime_error (String::compose ("Unresolved reference to asset id %1", id))
 {
 
 }
 
 TimeFormatError::TimeFormatError (string bad_time)
-       : StringError (String::compose ("Bad time string %1", bad_time))
+       : runtime_error (String::compose ("Bad time string %1", bad_time))
 {
 
 }
 
 MissingAssetError::MissingAssetError (boost::filesystem::path path, AssetType type)
-       : _path (path)
-       , _type (type)
+       : DCPReadError (
+               type == MAIN_PICTURE    ? String::compose ("missing asset %1 for main picture", path.string()) :
+               (type == MAIN_SOUND     ? String::compose ("missing asset %1 for main sound", path.string()) :
+                (type == MAIN_SUBTITLE ? String::compose ("missing asset %1 for main subtitle", path.string()) :
+                 String::compose ("missing asset %1", path.string()))))
 {
-       string type_name;
-       switch (_type) {
-       case MAIN_PICTURE:
-               type_name = " for main picture";
-               break;
-       case MAIN_SOUND:
-               type_name = " for main sound";
-               break;
-       case MAIN_SUBTITLE:
-               type_name = " for main subtitle";
-               break;
-       case UNKNOWN:
-               break;
-       }
-
-       _message = String::compose ("Missing asset %1%2", path.string(), type_name);
+
 }
 
 NotEncryptedError::NotEncryptedError (string const & what)
-       : StringError (String::compose ("%1 is not encrypted", what))
+       : runtime_error (String::compose ("%1 is not encrypted", what))
 {
 
 }
 
 
 ProgrammingError::ProgrammingError (string file, int line)
-       : StringError (String::compose ("Programming error at %1:%2", file, line))
+       : runtime_error (String::compose ("Programming error at %1:%2", file, line))
 {
 
 }
index 01ac9ccc25669be404b2b1ed60eea7a659b63889..801bfb019a92d80f309407fe9fd7d754ed536398 100644 (file)
 namespace dcp
 {
 
-/** @class StringError
- *  @brief An exception that uses a std::string to store its error message.
- */
-class StringError : public std::exception
-{
-public:
-       StringError () {}
-       StringError (std::string message)
-               : _message (message)
-       {}
-
-       ~StringError () throw () {}
-
-       /** @return error message */
-       char const * what () const throw () {
-               return _message.c_str ();
-       }
-
-protected:
-       std::string _message;
-};
-
 /** @class FileError
  *  @brief An exception related to a file
  */
-class FileError : public StringError
+class FileError : public std::runtime_error
 {
 public:
        FileError (std::string message, boost::filesystem::path filename, int number);
@@ -90,26 +68,23 @@ public:
 /** @class MiscError
  *  @brief A miscellaneous exception
  */
-class MiscError : public StringError
+class MiscError : public std::runtime_error
 {
 public:
        MiscError (std::string message)
-               : StringError (message)
+               : std::runtime_error (message)
        {}
 };
 
 /** @class DCPReadError
  *  @brief A DCP read exception
  */
-class DCPReadError : public StringError
+class DCPReadError : public std::runtime_error
 {
 public:
        DCPReadError (std::string message)
-               : StringError (message)
+               : std::runtime_error (message)
        {}
-
-protected:
-       DCPReadError () {}
 };
 
 /** @class MissingAssetError
@@ -127,27 +102,23 @@ public:
 
        MissingAssetError (boost::filesystem::path, AssetType = UNKNOWN);
        ~MissingAssetError () throw () {}
-
-private:
-       boost::filesystem::path _path;
-       AssetType _type;
 };
 
 /** @class XMLError
  *  @brief An XML error
  */
-class XMLError : public StringError
+class XMLError : public std::runtime_error
 {
 public:
        XMLError (std::string message)
-               : StringError (message)
+               : std::runtime_error (message)
        {}
 };
 
 /** @class UnresolvedRefError
  *  @brief An exception caused by a reference (by UUID) to something which is not known
  */
-class UnresolvedRefError : public StringError
+class UnresolvedRefError : public std::runtime_error
 {
 public:
        UnresolvedRefError (std::string id);
@@ -156,7 +127,7 @@ public:
 /** @class TimeFormatError
  *  @brief A an error with a string passed to LocalTime.
  */
-class TimeFormatError : public StringError
+class TimeFormatError : public std::runtime_error
 {
 public:
        TimeFormatError (std::string bad_time);
@@ -166,7 +137,7 @@ public:
  *  @brief An error raised when creating a DecryptedKDM object for assets that are not
  *  encrypted.
  */
-class NotEncryptedError : public StringError
+class NotEncryptedError : public std::runtime_error
 {
 public:
        NotEncryptedError (std::string const & what);
@@ -176,7 +147,7 @@ public:
 /** @class ProgrammingError
  *  @brief An exception thrown when a DCP_ASSERT fails; something that should not happen.
  */
-class ProgrammingError : public StringError
+class ProgrammingError : public std::runtime_error
 {
 public:
        ProgrammingError (std::string file, int line);