 
         // Title.
         guard let multilangTitle = mp.mainTitle(from: metadataElement) else {
-            log(level: .error, "Error: no title could be found for the publication. Metadata parsing aborted.")
-            return
+            throw OPFParserError.missingPublicationTitle
         }
         metadata._title = multilangTitle
         // Identifier.

        if let coverMetas = document.root["metadata"]["meta"].all(withAttributes: ["name" : "cover"]) {
            coverId = coverMetas.first?.string
        }
        parseMetadata(from: document, to: &publication)
        parseRessources(from: document.root["manifest"], to: &publication, coverId: coverId)
        parseSpine(from: document.root["spine"], to: &publication)
        return publication

    ///
    /// - Parameter document: Parse the Metadata in the XML <metadata> element.
    /// - Returns: The Metadata object representing the XML <metadata> element.
    internal func parseMetadata(from document: AEXMLDocument, to publication: inout Publication) throws {
        /// The 'to be returned' Metadata object.
        var metadata = Metadata()
        let mp = MetadataParser()
