         -> SignalProducer<Value, Error> {
             
             guard attemptsLeft > 0 else {
-                print("No attempts left. Aborting.")
-                return self.producer
+                return self.producer.on(failed: { error in
+                    print("\(NSDate()): Received error: '\(error)'. No attempts left - aborting.")
+                })
             }
             
             var generator = strategy.generate()
             guard let timeout = generator.next() else {
-                print("Failed to generate next timeout. Aborting.")
-                return self.producer
+                return self.producer.on(failed: { error in
+                    print("\(NSDate()): Received error: '\(error)'. No next timeout generated - aborting.")
+                })
             }
             
             // If an error occurs we catch it and map it to a new concatenated SignalProducer which will:
             //  - Create an inner SignalProducer that will wait 'timout' seconds
             //  - Replay the original SignalProducer when the previously delayed signal has completed
-            return self.flatMapError { _ -> SignalProducer<Value, Error> in
-                print("\(NSDate()): Received an error. Timing out for: \(timeout) seconds")
+            return self.flatMapError { error -> SignalProducer<Value, Error> in
+                print("\(NSDate()): Received error: '\(error)'. Retrying in: '\(timeout)' seconds")
                 return SignalProducer.empty
                     .delay(timeout, onScheduler: QueueScheduler())
                     .concat(self.retryWithBackoff(GeneratorSequence(generator), attemptsLeft: attemptsLeft-1))


private extension SignalProducerType {
    
     ///Retries the SignalProducer 'maxAttempts' number of times before failing. Implements an exponential backoff between each retry.
    func retryWithExponentialBackoff(maxAttempts: Int)
        -> SignalProducer<Value, Error> {
            return retryWithBackoff(ExponentialSequence(), attemptsLeft: maxAttempts)

import enum Result.NoError


public enum NetworkError : ErrorType {
    case ParseFailure
    case MissingData
